git submodule init / update が出来ない!No submodule mapping found in .gitmodules for path が出るときの対処

 

No submodule mapping found in .gitmodules for path

git の submodule は、
プロジェクトの内部に外部のリポジトリを組み込むことが出来る機能です。

submoduleで組み込まれたプロジェクトのソース管理は独立した状態にあり、
git clone した場合には、submoduleの内容は空です。

そのため、
git submodule init
git submodule update
として、
別途初期化・更新する必要があります。

しかしこの際に
No submodule mapping found in .gitmodules for path
というエラーで、操作ができない事態が発生しました。

submodule の init が出来なければ update も出来ない。
この原因は2通り考えられるようです。

【その1】
不要になったsubmoduleを削除したつもりが、
キャッシュがまだ残っている。

 →キャッシュを削除して対処
  git rm –cached サブモジュールディレクトリ

【その2】
.gitmodules が不正でsubmoduleを正常に処理できない

 →.gitmodulesを修正して対処

それぞれの原因と対処法について。

【その1】 submoduleを削除したが、キャッシュがまだ残っている。

これは、ディレクトリを消したり.gitmodulesから取り除くだけでは
キャッシュが残ってしまっていて、改めて git clone した際に
No submodule mapping found in .gitmodules for path
が発生するケースが多いようです。

submoduleの削除は、
.gitmodules
.git/config
からsubmoduleに関する記述を除去した上で、
submoduleのディレクトリをキャッシュからクリアします。
git rm –cached path/to/hoge
git commit
参考 http://d.hatena.ne.jp/oppara/20101116/p1

従って、 No submodule mapping found in .gitmodules for path
が出た場合には、for path の後ろに記載されたパスを
git rm –cached の後ろにくっつければOKです。

例)No submodule mapping found in .gitmodules for path “submodules/submoduleA”
→ git checkout — submodules/submoduleA

【その2】 .gitmodules が不正でsubmoduleを正常に処理できない

これは、パスが狂ってしまっている場合などです。

・Windowsのせい
・subtree-mergeをしたから
などが考えられます。

例えばWindowsでsubmoduleを追加した際に作成された.gitmodulesファイルが
¥記号でファイルパスを表しているために、MacやLinuxでパスが読み込めない
ということがあるようです。

このWindows問題場合は
直ちにWindowsの使用を中断し(※林檎信者の言葉)、
(※Mac、Linuxの場合)\を/に置換え、正しく読み込めるPathにします。

参考 git clone した後 git sudmobule init が失敗するときの対処方法

そしてもう一つ、.gitmodules が不正になるケースとして
subtree merge を行って親プロジェクトに組み込まれた子プロジェクトが
submoduleを持っていた場合。私の場合はこれでした。

subtree merge 前の、子プロジェクトの.gitmodulesが
そのまま深い階層に入ってしまっていて、それが原因で上手く動かないケース。

このような状態です → 親/子/.gitmodules
こうすることで治りました → 親/.gitmodules

.gitmodulesを git リポジトリ(プロジェクト)のルートに移動し
中のパスを修正することで正常化することが出来ました。
(既に.gitmodulesがリポジトリルートに存在する場合、
 必要に応じて上手くマージして下さい)

例)

mv 親/子/.gitmodules 親/.gitmodules
して、さらに
vi 親/.gitmodules で内容を編集、

[submodule "子/submodules/hogehoge"]
path = 子/submodules/hogehoge
url = git://github.com/hogehoge

となっていたのを

[submodule "子/submodules/hogehoge"]
path = 子/submodules/hogehoge
url = git://github.com/hogehoge

としました。

これで無事 git submodule init 出来るようになりました。

この記事はお役に立ちましたか?


コメント

コメントする