LoginSignup
10
10

More than 5 years have passed since last update.

submoduleからsubtreeに移行するときにハマったことども

Posted at

まとめ

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
10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10