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 で別のリポジトリを取り込めるのは目から鱗だった。