極楽とんぼのロボット製作記

情報工学系大学院生がロボットとその周辺技術や身の回りの出来事について紹介するブログ

【git】addできずにfatal: Pathspec '/hoge/piyo' is in submodule '/hoge'と表示される

gitでaddしようとした際に、
fatal: Pathspec '/hoge/piyo' is in submodule '/hoge'
と表示されて、addできなかった際の対処方法をまとめておきます。

まずは落ち着いてstatusを確認してみましょう。

$ git status
..... /hoge .....(submodule untracked content)

のように表示されているかと思われます。これはaddしようとしているgitリポジトリ(以降:上位リポジトリ)内にさらに別のgitリポジトリ(以降:下位リポジトリ)などがあった場合に、上位リポジトリが下位リポジトリをサブモジュールとして認識している際に起こる現象です。例えば下のようにgitリポジトリが入れ子になっている状況です。

foo
  /.git
  /hoge
    /.git
    /piyo

ここで

$ cd foo
$ git add /hoge/piyo

を行おうとすると、冒頭のようにエラーが出てaddできません。

対処方法としては、

$ git rm --cached /hoge
$ git add /hoge/piyo

のように一度、上位リポジトリの管理から外してから、直接addすることで解決できます。


このエラーには自分のROS環境をgitで管理している際に、catkin_wsをまとめて管理しようとして行き当たりました。catkin_wsのgitリポジトリが各外部パッケージのgitリポジトリをサブモジュール化しようとしてaddできない状態になっていました。
ちなみにこの方法では外部パッケージを自分のリポジトリに入れてしまうので、うっかりどこかに公開してしまうとライセンス違反になるかもしれません。ROSで同じようなことをしている方はお気をつけください。

参考サイト
stackoverflow.com