SubversionレポジトリをGitに移行する

自宅サーバーのSubversionレポジトリをGitに移行したのでメモ。

Gitではデータ転送用のプロトコルとして以下の4種類が使用できる。

  • Local
  • Secure Shell (SSH)
  • Git
  • HTTP

自分は自宅サーバーに既にセットアップしてある環境を再利用するため、SSHを使用することにした。

移行元のSubversionのレポジトリは/home/subversionにおいてある。また、移行先のGitレポジトリは/home/gitに置くことにした。

SubversionレポジトリからGitレポジトリへ移行するには以下の手順で行う。

  1. git svn clone で既存のSubversionレポジトリをGitレポジトリとしてローカルにcloneする
  2. タグを変換する
  3. 参照をローカルブランチに移動する
  4. git clone --bare でベアレポジトリを作る

以下は自宅サーバーのSubversionレポジトリをまとめて移行するためのスクリプト。/home/git以下でgitユーザーでログインして実行する。

#!/bin/sh
for directory in `ls ~subversion/`
do
    if [ -e ${directory}.git ]
    then
        echo "*** Skipping ${directory} ..."
        continue
    fi

    echo "*** Converting ${directory} ..."
    echo "*** Cloning ${directory} ..."
    cd
    git svn clone http://kishibe.dyndns.tv/svn/${directory} --authors-file=users.txt --no-metadata -s ${directory} || exit 1

    echo "*** Cleaning up ${directory} ..."
    cd  ${directory}
    git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag "$tagname" "tags/$tagname"; git branch -r -d "tags/$tagname"; done
    git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/$branchname"; git branch -r -d "$branchname"; done

    echo "*** Cloning ${directory}.git ..."
    cd
    git clone --bare ${directory} ${directory}.git || exit 1

    echo "*** Removing ${directory} ..."
    rm -Rf ${directory}
done