🦔

git submoduleってなんぞ???

2021/08/04に公開

ざっくり解説

  • リポジトリ内に別のリポジトリ『コミット』を参照したものを追加できる機能
    git clone時に同時にcheckout出来たりする。

  • 別のプロジェクトの内容を丸々参照できるので楽ちんだけどちょっと複雑

submodule設定ファイル

導入すると
.gitmodules
というファイルができるのでそこで状態を管理している

サンプルコード

// .gitmodulesの中身サンプル

[submodule "extension/hogehoge"]
	path = extension/hogehoge
	url = git@github.com:hogehoge.git
	branch = master

解説

  • pathは生成したい場所指定
  • urlはcloneするときのやつ、httpでもsshでもok
  • branchは参照ブランチが指定できる(でもあんまり意味があるのかよくわからない)

主に使いそうなやつ

submoduleをまとめて最新に更新

git submodule foreach 'git pull origin master' && git submodule update --remote

submodule付きのリポジトリをcloneする時

git clone git@github.com:hogehoge.git --recursive

という様な感じで--recursiveオプションを付ける。

submoduleにupdateがあってそれを適用したい。

git submodule update --init

これで適用できる。

  • 上記でダメな場合があるらしい
git submodule update --recursive

これならいけるらしい(よくわからん)

submoduleを間違って変更してしまった場合の対処

エディタのオート補完機能などで間違ってsubmoduleに

影響が及んでしまうことが結構あると思います。

その時どうやって戻せばいいんだーーーーーーというと、

git reset --hard

間違えて変更を加えてしまったsubmoduleに移動して

上記を叩くことで戻ります(そらそうなんだけど咄嗟に慌てるやつ)

submodule導入済みなんだけどgitでuntracked fileにならずupdateしても更新できない場合

反映させたいsubmoduleのディレクトリで下記のコマンドを叩く

git fetch && git reset --hard origin/master
// ブランチは追いたい所を適切に指定してください

これで再度追うことができるようになる

submoduleの参照URLを変更したがプロジェクトに反映されない

git submodule sync

syncしないとプロジェクトに反映されないみたいです。

詳しく解説している記事

https://qiita.com/kinpira/items/3309eb2e5a9a422199e9
https://www.m3tech.blog/entry/git-submodule#git-submodule-チートシート
https://rochefort.hatenablog.com/entry/git_submodule_update_recursive

Discussion