平衡点
2015/03/17
_ Subversion から Git への移行
最近、「もう Git で良いよ!」とお許し頂いたので、某リポジトリを Subversion から Git へ移行する作業を行なった。以下、そのメモ
Authors.txt の準備
そのままだと、コミットログが寂しい事になるので、既存の author を mapping するテキストを作成しておく。Subversion の working copy で
% svn log $SVN_URL | awk -F'|' '/^r[0-9]+/ { print $2 }' | sort -u
として、commit した人の一覧を出して、
svn username = Fullname <email address>
といった塩梅のテキストを作成しておく(以下、 Authors.txt とする)。
git svn でリポジトリを clone
以下で。
mkdir pkg git svn clone $SVN_URL --prefix=svn-import/ \ --stdlayout --authors-file=Authors.txt --no-metadata pkg
ここで、 pkg は実際に作成される Git リポジトリの名前. --stdlayout は、Subversion にありがちな trunk/tags/branches を Git の branch, tag に上手く mapping するための option. --no-metadata を指定すると、コミットログから SVN URL が削除される。Subversion を今後使うつもりがないなら指定しておくと良い。
Subversion の情報の変換
上記で --prefix=svn-import/ としたので、Subversion の branch, tag は Git では全てブランチとして
% git branch -r svn-import/hogehoge svn-import/herohero : svn-import/tags/hogehero-0_5
となる。このうち svn-import/tags を Git の tag に変換する。
ついでに、CVS 由来の、バージョン番号を =_</span>:)) で区切った番号付けを変更したり。
結果、以下の様なスクリプトを走らせた。
#! /bin/sh for branch in `git branch -r | egrep "svn-import/tags/.+$"`; do version=`basename $branch | sed 's/_/./g'` subject=`git log -1 --pretty=format:"%s" $branch` GIT_COMMITTER_DATE=`git log -1 --pretty=format:"%ci" $branch` \ git tag -f -m "$subject" "$version" "$branch^" git branch -d -r $branch done
タグはこれで良いかな。ブランチは不要そうなの軒並削除。 ついでに、今後弄らないであろう古いタグの名前付けを整理したり。
svn-remote.svn の削除
git svn で clone したので、Subversion関連の情報が .git 以下に残っている。 これを消すと終了
% git config --remove-section svn-remote.svn % rm -rf .git/svn .git/{logs/,}refs/remotes/svn-import/
まとめ
Git に慣れた身としては、 git-svn に比べて、やはり快適である。
…そして、過去の VCS から引き継いできたコミットログなので、ChangeLog の生成をどうするか、という点で悩み始める、など。いっそ git log をそのまま貼りつけてやろうかしらん。コミットがアトミックじゃないので、適宜 squash した方が良いだろうか。
あとは、リポジトリの外部公開かな。 Gitweb - Git SCM Wiki を使うのがやっぱり一般的なんだろうかね。