git version 1.7.2.3の方法
gitで管理されてるファイルやディレクトリをmvする場合、普通git mv
するわけだけども、その中にsubmoduleが含まれていると以下のようなエラーが出た
[$] <git:(develop*)> git mv zsh.d .zsh.d
zsh: correct '.zsh.d' to 'zsh.d' [nyae]? n
fatal: source directory is empty, source=zsh.d/auto-fu.zsh, destination=.zsh.d/auto-fu.zsh
ぐぐったらこんなページが見つかった
http://noone.org/blog/English/Computer/VCS/How%20to%20move%20a%20git%20submodule.html
要はgitのバグで、まだ修正されてないから手動で回避しないといけないらしい。
で、その回避の仕方(大体上記ページに書いてあることを訳しただけ)
- 普通に
mv
する (mv zsh.d .zsh.d
) - mvした先のファイルを
git add
する(git add zsh.d
) - mvする前のインデックスを
git rm --cached
で消す(git rm -r --cached .zsh.d
) - .gitmodule ファイルの、mvしたところの記述を書き換える
- 普通にコミット
これでsubmoduleのmvが出来た。めんどくさ...
git version 1.7.10.2 (Apple Git-33) の方法
※色々試行錯誤しながらやってたので、ちょっと自信無いです
- 普通に
mv
する (mv zsh.d .zsh.d
) - mvした先のファイルを
git add
する(git add zsh.d
) - mvする前のインデックスを
git rm --cached
で消す(git rm -r --cached .zsh.d
) - .gitmodule ファイルの、mvしたところの記述を書き換える
ここまでgit version 1.7.2.3と同じ。しかしこのversionだとこの後git status
さえ出来ない。git status
すると
fatal: Could not chdir to '../../../../zsh.d/auto-fu.zsh': No such file or directory
fatal: 'git status --porcelain' failed in submodule .zsh.d/auto-fu.zsh
みたいなエラーが出る。ので、更に手を加える必要がある。
- submoduleを取り込んでいる方のgitプロジェクトの.git内の以下のファイルの中の記述を、mvしたディレクトリのところを書き換える。
.git/modules/[renameしたディレクトリ名]/[submoduleディレクトリ名]/config
- ↑とは別に、submoduleのディレクトリの
.git
というファイルの中に記述されているディレクトリ名を新しいものに変える。
これで直る。多分。
っていうか
ここまで来ると新しくgit submodule add
して古い方削除した方が早い気がする。
もっと簡単な方法あったら教えて下さい