まとめ
git subtree add するときには、取り込むリポジトリのヒストリも取り込んでいることを意識しましょう。
実行したコマンド
メインのプロジェクトの中で、submoduleとして別プロジェクトのリソースを管理しているような構成のリポジトリがあったとします。
<PROJECT_ROOT>
├─ 諸々の開発リソース
└─ Library1(submoduleとして管理しているライブラリ)
└─ Library1のリソース一式
こんなコマンドを実行して、submoduleで管理していたライブラリをsubtreeに移行しました。
# masterから作業用ブランチを作成
git branch -b working
# submoduleを解除し、リソースを全て削除
git submodule deinit ./Library1
git rm -rf ./Library1
git commit
# Library1をsubtreeとして追加する
git remote add lib1 git@github.com:someuser/Library1.git
git subtree add --prefix Library1 lib1 master --squash
# この時点でマージコミットが実行されるため、ひとまずsquashしてみる
git checkout master
git merge working --squash
git push origin master
実行後、リソースは問題なく追加できていたのですが……以下のような現象に苦しめられました。
現象
git subtree pull
等のコマンドを実行しようとしても、コマンドが正常終了しない。
原因
masterをworkingにマージするとき、--squash
オプションをつけていたため
git subtree add
実行時のマージコミットも纏められてしまい、どのリポジトリから何を参照しているのか判らない状態になっていた。
対策した内容
git subtree add
で追加したLibrary1を削除した後、もう一度git subtree add
で取り込み直す。
git merge master
を実行するとき、--squash
オプションをつけずに実行する。
# masterから作業用ブランチを作成
git branch -b retry
# submoduleを解除し、リソースを全て削除
git rm -rf ./Library1
git commit
# Library1をsubtreeとして追加する
git remote add lib1 git@github.com:someuser/Library1.git
git subtree add --prefix Library1 lib1 master --squash
# git subtree addで発生したマージコミットはsquashしない
git checkout master
git merge retry
git push origin master