svn の repository を git の repository に変換するには、git-svn を使用します。
git-svn は、svn の repository を git コマンドで直接さわれる様にしてくれます。
Ubuntu の場合、git と git-svn のインストールは以下のコマンドで
% sudo aptitude install git-core git-svn
以下、変換前の svn repository を svn-repo、変換後の git repository を git-repo と表記します。
流れとしては、以下の感じ
1. svn-repo のログのユーザー名を、git 形式に変換するための authors.txt を作成
2. ローカルにカラの git-repo を作成
3. svn-repo を git svn clone コマンドで取り出す ※ 取り出したものを git-svn-repo と表記
4. git-svn-repo の origin に git-repo を割り当てる
5. git-svn-repo の trunk を git-repo の master branch として移行
6. git-svn-repo に trunk 以外にも branch があれば git-repo へ移行
7. git-svn-repo に TAG があれば、git-repo へ移行
8. 必要なら git-repo を remote の gitosis などへ移行
9. git-svn-repo はもういらないので削除
10. おしまい
注意点は、
- 明示的に svn の trunk を、git の master に変換しないといけない
– 普通に移行すると、svn の trunk は、git-repo の trunk というただの branch になる
– svn の最後に行われた commit のある trunk/branch が git の master になってしまう
- svn-repo を、まずは、ローカルの git-repo へ移行する
– 直接 gitosis などのサーバー上の git-repo に移行すると失敗したときに大変
1. svn-repo のログのユーザー名を、git 形式に変換するための authors.txt を作成
% cat authors.txt
userA = user1userB = user1 userC = user2 userX = user3 userZ = user4
svn-repo のログにある userA を、移行後の git-repo 上の user1
このファイルは後で使う。
2. ローカルにカラの git-repo を作成
% mkdir git-repo.git % cd git-repo.git % git --bare init Initialized empty Git repository in /home/ice/git-repo.git/ % cd ..
ここに、今、svn-repo にある trank/branches/tags を移行する
3. svn-repo を git svn clone コマンドで取り出す ※ 取り出したものを git-svn-repo と表記
% git svn clone -A authors.txt -s /path/to/svn-repo git-svn-repo.git % cd git-svn-repo.git/ % git branch * master % git branch -r branch-1 tags/tag-1 tags/tag-2 trunk % git branch local-trunk refs/remotes/trunk % git branch local-trunk * master
/path/to/svn-repo は svn の repository へのパス
ローカルなら /home/ice/svn/svn-repo の様な感じ
サーバーなら svn+ssh://my-server/var/svn/repos/svn-repo の様な感じ
この svn-repo には、trunk と branch-1 という branch が1つ、tag-1 と tag-2 という名前の tag が2つある
4. git-svn-repo の origin に git-repo を割り当てる
% git remote add origin /home/ice/git-repo.git
5. git-svn-repo の trunk を git-repo の master branch として移行
まず、local-trunk という名前の branch を作成、svn の trunk を指す様に。
% git branch local-trunk refs/remotes/trunk % git branch local-trunk * master
git-svn-repo の local-trunk を、git-repo の master として移行
% git push origin local-trunk:master
6. git-svn-repo に trunk 以外にも branch があれば git-repo へ移行
% git branch local-branch-1 branch-1 % git push origin local-branch-1:branch-1
master も branch-1 も扱いは同じ branch なので、先ほどとほぼ一緒
7. git-svn-repo に TAG があれば、git-repo へ移行
% git tag tag-1 refs/remotes/tags/tag-1 % git tag tag-2 refs/remotes/tags/tag-2 % git tag tag-1 tag-2 % git push --tags
8. 必要なら git-repo を remote の gitosis などへ移行
9. git-svn-repo はもういらないので削除
10. おしまい

