Hatena::Grouprekken

murawaki の雑記

2010-04-07

Migrating from Subversion to git

二つの作業のログ。(1) Subversion から git への移行。(2) 新たな git repository 二つを merge。

やりたいこと。Subversion から git への移行。Subversion 時代は自分用のレポジトリを二つ使用。相互に関連しているので、移行を機に統合。

Subversion から git への移行には svn2git を使う。git-svn だとずっと Subversion に貼り付きそうだが、目的は Subversion とおさらばすること。誤解かもしれない。ちゃんと調べたわけではない。

svn2git を gem で取ってくる。

gem install svn2git --source http://gemcutter.org

Subversion の repository には、svn というアカウントを作って svn+ssh でアクセスしていた。二つの repository は、projectAprojectB とする。

projectA を git に移行。projectB も同様。

mkdir projectA
cd projectA
svn2git svn+ssh://svn@repo-host/projectA --rootistrunk

なぜ --rootistrunk でうまくいくのかわかっていない。ファイルは current working directory 直下に生成される。適当なディレクトリを作ってからそこで実行する。

projectAprojectB を merge。とりあえず projectA/projectB というディレクトリ構成にする。気に入らない部分は後で移動させればよい。

cd projectA-git-path
git remote add -f projectB projectB-git-path;
git merge -s ours --no-commit projectB/master;
git read-tree --prefix=projectB -u projectB/master;

そして git commit。これで projectA でも projectB の履歴を引き継げている。

projectA 側で projectB を track する必要はない。縁を切る。

git branch -rd projectB/master

.git/config に svn や projectB の痕跡が残っているが問題なかろう。git branch -a では出てこない。

git clone --bare でハブとなる repository を作る。こちらの .git/config には svn や projectB の痕跡は残っていない。

svn:ignore の情報は引き継がれない。手動で等価な .gitignore を作る。