SVN -> Gitへの移行メモ
SVNからGitへ移行したので、その時の実施内容をメモっておく。
git-svnで移行
移行にはgit-svnを使う。git-svnの使い方はこことかで解説されているが、「git svn clone」コマンドでは移行しなかった。
理由は以下。
- 全てbranchesの下にあればよいのだが、物によってはbranches/customer_yyy/v1.xのようにサブディレクトリがさらに切ってあったりする
- 移行したくないブランチもあったりする
というわけで、コマンドではなく設定を直接修正して移行することにした。
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で管理していた時に、過去に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もコンパクトになりました。