messaliberty

hulor と開発チームの最新情報

svn の repository を git の repository に変換する方法

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

Share and Enjoy:
  • Digg
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • email
  • MySpace
  • Reddit
  • Tumblr
  • Yahoo! Buzz
  • StumbleUpon
  • Technorati
  • Twitter

No related posts.

Related posts brought to you by Yet Another Related Posts Plugin.

Leave a Reply