Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save sambatriste/a05ef156ed204f450b09434f88f855c9 to your computer and use it in GitHub Desktop.
Save sambatriste/a05ef156ed204f450b09434f88f855c9 to your computer and use it in GitHub Desktop.

git subtreeを利用したマルチモジュール開発

動機

複数のモジュールを横断的に開発する場合、扱う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 で各モジュールを集約リポジトリに取り込む

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

個別リポジトリでの変更を取り込む場合、以下のようにしてpullします。

git subtree pull -P mod_a mod_a_origin feature-foo

集約リポジトリから個別リポジトリからにpush

フィーチャーが完成したら、個別モジュールにpushして 成果を反映します。

git subtree push -P mod_a mod_a_origin feature-foo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment