SVN -> Gitへの移行メモ

SVNからGitへ移行したので、その時の実施内容をメモっておく。

git-svnで移行

移行にはgit-svnを使う。git-svnの使い方はこことかで解説されているが、「git svn clone」コマンドでは移行しなかった。
理由は以下。

  • 全てbranchesの下にあればよいのだが、物によってはbranches/customer_yyy/v1.xのようにサブディレクトリがさらに切ってあったりする
  • 移行したくないブランチもあったりする

というわけで、コマンドではなく設定を直接修正して移行することにした。

まずはリポジトリの作成

移行先は中央リポジトリとするのでワーキングツリーは不要なため--bareを付けた。

git init --bare myrepo.git
svn-remoteを設定

myrepo.git/configを以下のように編集し、svnからのfetch先設定を追記する。なお、今回はタグは移行はしていない。

  • fetchは何個でも書けるので、trunkと移行したいブランチを個別に書く。例だとSVNのtrunkとbranches/developブランチを移行するように設定している。
  • branchesで書くときは、特定ディレクトリ以下をまとめてブランチとして移行したい時に使う。
[svn-remote "svn"]
        url = http://my_svn_host/svn/myrepo
        fetch = trunk:refs/heads/master
        fetch = branches/develop:refs/heads/develop
        branches = branches/customer_yyy/*:refs/heads/*
git svn fetchでSVNから履歴を取り込む
git svn fetch

これでSVNからGitへの移行は完了。

Gitリポジトリをコンパクト化

これは必ずしも必要ではないが、SVNで管理していた時に、過去にJARなどのバイナリファイルもコミットしてしまっていた。そのため、リポジトリのサイズがかなり巨大になってしまっていた。
現在はJARファイルは格納していないし*1、過去の履歴でそのJARを参照したいケースもないので、歴史から抹消してコンパクト化することにする。

Gitでは歴史をさかのぼって特定のファイルやディレクトリを削除することも簡単にできる。簡単すぎて怖いくらい…
以下のように、git filter-branchというコマンドを使う。

git filter-branch --tree-filter 'rm -rf lib' HEAD --all

'rm -rf lib'のところに、削除コマンドを渡せばよい。libフォルダにJARファイルをたくさん格納していたので、libフォルダ以下を消すようにした。
「--all」は、全ブランチに対しても同様の削除を行うさいに必要。masterブランチだけ消しても他のブランチにバイナリがあると結局サイズは変わらないので、全ブランチから消しちゃう。

Cloneしなおしが必要?

git filter-branch完了後、du -hs . でリポジトリのサイズを見ても変わっていない・・・?(むしろ増えている??)

git gc

としてみても駄目。

git clone --bare http://my_git_host/git/myrepo.git

でcloneしなおすとこちらはOK。100MBオーバ⇒1MB以下と約1/100もコンパクトになりました。

*1:JARやZIPはMavenリポジトリで管理するようにした。