複数のgitリポジトリを履歴を残したまま統合する

引き継いだプロジェクトが、foo_pc, foo_sp, foo_commonみたいなかんじでリポジトリが分かれていて、同じ機能の開発やっているのにそれぞれにPullReqだしたり、リリースノートを書いたりするのがしんどいので、統合した。以下に統合した時の手順をまとめておく。

まず、新しくリポジトリを用意して、以下のように統合したいリポジトリ毎にディレクトリを作成して(.gitkeepとか用意して)、コミットする。

foo
├── foo_common
├── foo_pc
└── foo_sp

次のようなスクリプトを実行する。git 2.9 から無関係なヒストリもってるブランチ同士をマージするときは --allow-unrelated-histories つけないとエラーになるのがハマりどころ。

for repo in foo_pc foo_sp foo_common; do
git remote add ${repo} ~/${repo}
git merge -s ours --no-commit --allow-unrelated-histories ${repo}/master
git read-tree --prefix=${repo} -u ${repo}/master
git commit -am "Merge in ${repo}."
done