Git リポジトリの統合

目的

別々に 2つの Git リポジトリがある。この2つを統合して一つのリポジトリにしたい。これらは元々同一のソースコードを管理しているものなのだが、リポジトリとして作成された時期が異なり、別々に存在していた。

経緯

ソースコードの運用者が変わったことで、一時的に VCS を利用していない期間があった。

  1. Subversion で管理していた期間 (前々任者)
  2. VCS を何も使用していない期間 (前任者)
  3. Git で管理している期間 (現在)

我々が Git を使い始めたときには、古い Subversionリポジトリは手に入らなかったため、最新のソースを元に新規のリポジトリとして管理を開始した。後に Subversion リポジトリが Git 形式に変換された形で手に入ったため、2つのリポジトリを統合しようということになった。

手順

http://d.hatena.ne.jp/gnarl/20091109/1257778688
のコメント欄に書いてあることを参考にしてみた。

古いリポジトリ: repo.old
新しいリポジトリ: repo.new

cd repo.old
git fetch ../repo.new refs/heads/master:refs/heads/new-branch
git checkout new-branch
git rebase master
(コンフリクトが発生したら都度対応, git add,  git rebase --continue)
git checkout master
git merge new-branch
git branch -d new-branch

解説

重要な点は以下の3つの作業。

  1. 古いリポジトリに対して new-branch というブランチ名で、新しいリポジトリを取り込む (fetch)。
  2. new-branch の始点を master ブランチの先頭に持ってくる (rebase)。
  3. master ブランチに new-branch ブランチの内容をマージする (merge)。

これで、古いリポジトリに対して、新しいリポジトリでの修正を取り込むことができた。
fetch で別のリポジトリを取り込めるのは目から鱗だった。