複数のモジュールを横断的に開発する場合、扱うgitリポジトリも複数になります。 (モジュールとgitリポジトリが1:1とする)
あるフィーチャーを開発する際、チームがどのモジュールのどのブランチで作業しているか把握するのが大変です。
変更対象モジュールのリポジトリに同名のブランチを切ることで多少わかりやすくなります。 例えば、以下のようになります。
moduleA/feature-foo moduleB/feature-foo moduleZ/feature-foo
しかし、以下の様な問題が残ります。
- どのモジュールをクローンしないといけないかわからない
- たくさんクローンするのがめんどう
- 毎日たくさんのモジュールをpullするのがめんどう(そのスクリプトをつくるのが面倒)
- リポジトリ毎に別々にコミットするがめんどう
- チームで情報共有するために文書化が必要
git subtreeを使って、複数のリポジトリを集約します。
aggregate moduleA src/main/java test/java moduleB src/main/java test/java moduleZ src/main/resources
集約リポジトリで作業します。このリポジトリは単一のリポジトリに見えます。 例えば、moduleAのファイルを更新した場合、集約リポジトリに対する更新とみなされます。
当面は、集約リポジトリで作業を行います。 フィーチャーが完了したら、git subtree pushで各リポジトリに変更をpushします。
git init aggregate
cd aggregate
git remote add moduleA_origin http://repo/moduleA
git remote add moduleB_origin http://repo/moduleB
git remote add moduleZ_origin http://repo/moduleZ
git subtree add --prefix=moduleA moduleA_origin feature-foo --squash
git subtree add --prefix=moduleB moduleB_origin feature-foo --squash
git subtree add --prefix=moduleZ moduleZ_origin feature-foo --squash
git commit
個別リポジトリでの変更を取り込む場合、以下のようにしてpullします。
git subtree pull -P mod_a mod_a_origin feature-foo
フィーチャーが完成したら、個別モジュールにpushして 成果を反映します。
git subtree push -P mod_a mod_a_origin feature-foo