💭

git submodule の使い方

2022/08/10に公開

git で管理してるソースツリーの中に、他の git tree を追加したくなったので調べたメモ。

現状のツリー

tot
└── subarashii_source.c

完成時のツリー

tot
├── hokano_git
│   ├── Makefile
│   ├── tanin_no_source.c
│   └── tanin_no_source.h
└── subarashii_source.c

他のツリー(submodule)の追加

git submodule add <clone url> hokano_git するだけ。
submodule add すると、以下のファイルが追加されている。

$ git status
ブランチ main
コミット予定の変更点:
  (use "git restore --staged <file>..." to unstage)
	new file:   .gitmodules
	new file:   hokano_git

これをコミットして完了。submodule の中を更新すると、外では同様に hokano_git がファイル更新されるので、こちらもコミットする。

メインのツリーと submodule がずれたとき

git reset とか git checkout すると、少しおかしなことになる。
そのときは git submodule update すればよい。

submodule 含めて git archive できない

回避策として git-archive-all というモジュールがある。実行は git tree 直下で git-archive-all output.tar のようにする。拡張して出力フォーマットを判断してくれるので、git archive より便利。

submodule 内でコミットされていないファイルがあると・・・

以下のようなメッセージが git status に表示されて、外からは add も何もできないので、submodule 内でコミットしなければならない。

modified:   tot/hokano_git (modified content)

Discussion