複数のリポジトリを統合する際に、独立した履歴を扱う操作をいくつかしたので、ここにまとめておく。
使用したGitのバージョンは 2.17.1
。
操作
全く新しい履歴を開始する
また新しく 'Initial commit' したいときに使う。ひとつのリポジトリで仮想的に複数のリポジトリを管理できることになる。例えば、
- GitHubにある捨てる予定のリポジトリをそのまま再利用できる
- 検証用の単純なアプリを作る際も同じリポジトリで管理できる
- 構築済みのCI/CDを使うこともできる
- 新しいリポジトリで管理することになったときに切り出しやすい
git checkout --orphan ${NEW_BRANCH_NAME}
git rm -r --cached . # 全ファイルをunstageする
※ orphan: 「孤児」「親のない」
(補足)空のコミットを作る
'Initial commit' をrebaseできないと嫌なときに、最初に作ることがある。(実際は次節の方法で可能なので、rebase目的では不要)
git commit --allow-empty -m 'Empty commit'
履歴を根元からrebaseする
'Initial commit' さえもrebaseしたいときに。rebase先のブランチ等を指定する代わりに --root
オプションを指定すればいい。
git rebase -i --root # 念のためinteractive
独立した履歴をマージする
独立した履歴を複数持てるなら、逆にそれらをマージしたくなることもある。オプションを追加すれば可能になる。
git merge --allow-unrelated-histories ${ANOTHER_BRANCH}
(補足)複数のリポジトリを読み込む
普通にリモートリポジトリを追加すればいい。
git remote add origin-repo1 https://github.com/org1/repo1.git
git fetch origin-repo1
git remote add origin-repo2 https://github.com/org2/repo2.git
git fetch origin-repo2
(補足)複数の履歴を同時にマージする
Gitは複数の履歴を同時にマージできる。しかし、履歴が独立している場合はうまく動いてくれなくて、コマンドを追加して修正する必要がある。
git merge --allow-unrelated-histories ${OTHER_BRANCHES}
git read-tree HEAD ${OTHER_BRANCHES}
git commit -m 'Merge histories'
git reset --hard
git read-tree
は8つまでしか対応していないが、参考元のコメントにはその制限を超えられた方法が書かれていた(私は試していない)。また、 HEAD を含めておかないと本線のファイルが消えてしまったので、上記コマンドには含めている(なので OTHER_BRANCHES は7つまで)。