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 = user1
userB = 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. おしまい