パンダのメモ帳

技術系のネタをゆるゆると

CentOS 5.6 上のリポジトリを Subversion から Git に移行する

svn2git を使って Subversionリポジトリを Git に移行した時のメモ。

1. git, git-svn をインストール

git をインストールするのはもちろんのこと、 svn2git が内部で使用する「git svn」コマンドを実行するためには git-svn パッケージも必要となる。両方とも yum でインストール可能。

[user@localhost ~]$ sudo yum install git git-svn

2. svn2git をインストール

Subversion から git への移行ツール svn2git をインストール。 svn2git は ruby スクリプトなので gem でインストールする。

[user@localhost ~]$ sudo gem install svn2git
[sudo] password for user: 
sudo: gem: command not found

gem がない……

[user@localhost ~]$ which gem
/usr/bin/which: no gem in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin)
[user@localhost ~]$ which ruby
/usr/bin/which: no ruby in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin)

gem も ruby も入っていませんでした(´Д`)

3. Ruby + RubyGems をソースからインストール

CentOS 5.6 の yum で ruby をインストールすると 1.8.5 がインストールされ、そのままだと svn2git をインストールすることができない(gem install svn2git が失敗してしまう)。そこでソースから Ruby および RubyGems をインストールする。yum でインストール済の場合は yum erase で ruby を一旦アンインストールする。

3-1. Ruby のインストール

とりあえず make まで

[user@localhost ~]$ cd /usr/local/src
[user@localhost src]$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p358.tar.gz
[user@localhost src]$ tar xzf ruby-1.8.7-p358.tar.gz
[user@localhost src]$ cd ruby-1.8.7-p358
[user@localhost ruby-1.8.7-p358]$ ./configure --prefix=/usr/local
[user@localhost ruby-1.8.7-p358]$ make

通常のインストール手順

[user@localhost ruby-1.8.7-p358]$ sudo make install

checkinstall を使う場合のインストール手順

[user@localhost ruby-1.8.7-p358]$ sudo checkinstall --fstrans=no
[user@localhost ruby-1.8.7-p358]$ rpm -ivh /usr/src/redhat/RPMS/x86_64/ruby-1.8.7-p358-1.x86_64.rpm

確認

[user@localhost ~]$ which ruby
/usr/local/bin/ruby
[user@localhost ~]$ ruby --version
ruby 1.8.7 (2012-02-08 patchlevel 358) [x86_64-linux]
3-2. RubyGems のインストール
[user@localhost ~]$ cd /usr/local/src
[user@localhost src]$ wget http://rubyforge.org/frs/download.php/76011/rubygems-1.8.22.tgz
[user@localhost src]$ tar xvzf rubygems-1.8.22.tgz
[user@localhost src]$ cd rubygems-1.8.22
[user@localhost rubygems-1.8.22]$ sudo ruby setup.rb

確認

[user@localhost ~]$ which gem
/usr/local/bin/gem
[user@localhost ~]$ gem --version
1.8.22

4. 今度こそsvn2git をインストール

[user@localhost ~]$ sudo gem install svn2git
[sudo] password for user: 
Fetching: svn2git-2.2.1.gem (100%)
Successfully installed svn2git-2.2.1
1 gem installed
Installing ri documentation for svn2git-2.2.1...
Installing RDoc documentation for svn2git-2.2.1...
[user@localhost ~]$ which svn2git
/usr/local/bin/svn2git

インストールできた!(´∀`)

5. svn2git を実行する

ポイントは「svn+ssh 経由で実行しない」こと。Subversionリポジトリsvn+ssh 経由でアクセスすると「Malformed network data ...」とかいうエラーが頻発してまともに変換ができない。そのために今回は CentOS 上に svn2git 環境を構築することでサーバー内で完結できるようにした。

svn2git のコマンドは次のようになる。

svn2git <SVNリポジトリURL> --verbose --authors /path/to/authors

ここで最後に指定している「authors」と呼ばれるファイルは、subversion 上の author 情報を git の author 情報に変換するためのマッピング定義ファイルで、次のような内容であらかじめ作成する。

john = John Smith <john_smith@example.com>

左辺が Subversion 上に記録されている author 名、右辺が git に保存する author名+メールアドレスとなる。Subversion 上に未定義の author が出現するとエラーとなるので、必要な情報を随時追加していってもよい。

というわけで、ローカルの SVNリポジトリをGitリポジトリにインポートするコマンドは次の通り。

[user@localhost ~]$ cd /path/to/git
[user@localhost git]$ svn2git file:///path/to/svn --verbose --authors /path/to/authors

上記手順で、 /path/to/git ディレクトリ以下に .git ディレクトリ および作業コピーが生成される。

おつかれさまでした。