git mvで大文字を含むディレクトリ名を変更できない


はじめに

git mvでリポジトリ内の大文字のディレクトリ名を変更しようとしたところ、できませんでした。

準備

cd ~
mkdir repo && cd repo
git init
mkdir Capital
echo "hogehoge" -> Capital/Hoge.txt
git add .
git commit -m "first commit"

上から順に実行すると、

repo
└── Capital \\大文字ディレクトリ
    └── Hoge.txt \\大文字textファイル

こんな感じの実験環境ができます。

ハマったところ

textファイルの「 Hoge.txt 」を小文字にします。

git mv Capital/Hoge.txt Capital/hoge.txt

実行すると、

repo
└── Capital
    └── hoge.txt

ちゃんと小文字になりました。

コミットしておきましょう。

git commit -m "renamed Hoge.txt to hoge.txt"

次にディレクトリ「 Capital 」を小文字にします。

git mv Capital/ lowercase/

同様に実行すると・・・

fatal: renaming 'Capital' failed: Invalid argument

エラーが・・・

解決策

1 : 一時的な空ディレクトリを作る。

   mkdir tmp

2 : 大文字ディレクトリ(Capital)の中身(hoge.txt)を一時的なディレクトリ(tmp)にgit mvで移す。

   git mv Capital/* tmp/

こんな感じになる。

   repo
   ├── Capital
   └── tmp
       └── hoge.txt

3 : 空になった大文字ディレクトリ(Capital)を消す。

   rm -r Capital

4 : 一時的なディレクトリ(tmp)の名称 をgit mvで好きな名称(lowercase)に変更。

   git mv tmp lowercase

コミットしておく。

   git commit -m "renamed Capital to lowercase"

5 : 解決!

   repo
   └── lowercase
       └── hoge.txt

コミット履歴はどうなっているか

好き勝手にディレクトリを作ったり、消したりしました。

コミット履歴がおかしなことになっていないか(?)確認してみます。

❯ git show
commit 585776e1411a08f42aab249f37cd008882f19b0c (HEAD -> master)
Author: hoge
Date:   hoge

    renamed Capital to lowercase

diff --git a/Capital/hoge.txt b/lowercase/hoge.txt
similarity index 100%
rename from Capital/hoge.txt
rename to lowercase/hoge.txt

本来やりたかった

git mv Capital/ lowercase/

ができた場合と同じ履歴になりました。

よくわからん、、、