タイトル通りですが、git-svnでコードの管理をしている最中に、SVNサーバの移行が行われ、git-svn rebaseでChecksum mismatchが発生しました。SVNを使用しない!とすれば解決出来たかも知れませんが、まだSVNにコミットが発生する可能性があったため、git-svnが正常動作するようにしました。
#状況
##管理スタイル
SVNで管理している既存製品があり、自分一人で改修することになった。周りの了承を得てから、Gitへ移行しつつ、SVN側も少しは変更が入る可能性があったため一人でgit-svnを使用していた。
##SVNサーバ移行
WindowsXPで動いていたSVNサーバを、サポート切れ&動作が重いので仮想マシンのCentOSへ移行。この際、旧WinXPと同じIPをCentOSに割り当てた。
##問題現象
git-svn
時に必ずchecksumが不一致となり、うまく行かない。
$ git svn rebase
Checksum mismath: hoge/trunk/hoge.cs xxxxxxxxxxx
expected: aaaaaaaaaaa
got: bbbbbbbbbbb
stackOverflowでこんなの見つけたけど、多分根本的な原因が違う。サーバが変わって元のSVNリポジトリのチェックサムと合わなくなったと思われる(予想)。
#最終目標
git-svnが使用出来て、gitのログ、変更内容が正常に入っているgitリポジトリを作る。
#解決方法
移行後のSVNからはgit svn clone
でローカルリポジトリを作成出来るから、旧SVNサーバのgit-svnリポジトリ(旧リポジトリ)から新サーバのgit-svnリポジトリ(新リポジトリ)に変更を反映させ、以降は新リポジトリを使用する様にする。
##前提
- svnのトランクとmasterが一致
- 作業内容はmasterから分かれたAブランチにコミットされ、masterには未マージ
##手順
- 新SVNサーバからgit-svnリポジトリを作成する。
- 旧リポジトリのリモートとして、新リポジトリを追加する
$ ls
oldrepository newrepository
$ cd oldrepository
$ git remote add svn ../newrepogitory
$ git fetch svn
- 新リポジトリと旧リポジトリを合わせる。
この時点では新リポジトリと旧リポジトリでは、コミットが内容は同じでもコミットIDがちがうので別物として扱われるので、旧リポジトリのmasterを新リポジトリのmasterに変える。
git rebase svn/master
- 旧リポジトリの変更が入ったブランチAをmasterからの派生に変える
$ git checkout A
$ git rebase master
- 新リポジトリに旧リポジトリの変更(ブランチA)を送る
git push svn A
以上でgit-svnが正常に動作し、変更点も入った新リポジトリができました。