結構はまったし、後日別のリポジトリを移行することがありそうなのでメモを残しておきます。
前提・事前準備
- 一旦、ローカルのWindows上のGitに移行してからbareリポジトリ(今回はGitLabだったが手順的には何でもOK)にプッシュする流れ
- Git for windowsを事前にインストールしておく
- Subversionのサーバからリポジトリをディレクトリまるごと取得できること
git svn clone
の最中 svnのパスワードを頻繁に聞かれる問題を色々やってみたが回避できなかったので、ローカルにSVNディレクトリまるごと持ってくる手順で行いました。
今回、一番ハマったのはここでした。 - 作業はGit Bashから行いました。
手順
-
Subversionのサーバからリポジトリのディレクトリ丸ごと取得してローカルのWindows上の配置する。
今回はC:¥temp¥にmyappリポジトリのディレクトリを作成 -
Svnのコミット履歴から authorのリストを作成する。
svn log --xml file:///temp/myapp | grep "<auth" | sort -u | perl -pe 's/<author>(.*?)<\/author>/$1 = $1 <$1\@example.com>/' > svnauthors.txt
Gitへはメールアドレスを登録する必要がありますが、会社なのでドメインが固定できますし、SVNのユーザ名=会社のメールアドレスだったのですんなり作成できました。
こんなファイルが出力されます。
taro = taro <taro@example.com>
hanako = hanako <hanako@example.com>
- ローカルのSVNからGitへデータ変換します。
git svn clone -A svnauthors.txt -s --prefix=svn/ file:///c/temp/myapp
5000コミット程度でtrunk/branches/tagsの素直な構成だったのでトラブルなく終わったが、ブランチが多かったので4時間ぐらい掛った。
※この手順だと、コミットログにgit-svn-id: file:///c/temp/myapp/trunk@1529 b2b6dba9-8bd8-43e8-adf2-ced20190beb5
のようなsvnとの紐付けが追記されます。私は気にせず残していますが、嫌な場合は --no-metadata
オプションを付けるか、後からfilter-branchでまとめて削除すると良いかと思います 1
- ここまで終わったら、.git/config のSVNの向き先をローカルからサーバに変更しておきます。
[svn-remote "svn"]
#url = file:///c/temp/myapp
url = svn+ssh://example.com/repos/myapp
-
移行期間中にSVNに入った変更を
git svn fetch
で取得します。 -
ブランチとタグを作成
git branch branch1 svn/branch1
git tag tag1 svn/tags/tag1
ブランチとタグの数だけ繰り返す。数が多い場合はシェルで一気に行える 2
git branch -r | egrep --text --invert-match "tags|trunk" | xargs -iBRANCH_NAME git branch BRANCH_NAME BRANCH_NAME
git branch -r | egrep --text "tags/" | cut -d / -f3|xargs -iVAR git tag svn/VAR svn/tags/VAR
--prefix=svn/
付きでgit svn clone
したので、tagの方は参考サイトのコマンドを少し変更しています。
また、git上のブランチ/タグの名もprefixにsvn/
を付けて移行しましたが、そこら辺はお好みで変えて下さい。
- ブランチとタグをbareリポジトリへプッシュする
git remote add origin <url> # bareリポジトリを登録
git push -u origin --all # ブランチを全てプッシュ
git push origin --tags # タグを全てプッシュ
おわりに
移行元の構成によってはcloneでハマるようですが、
今回はかなりキレイに移行することが出来ました。
参考リンク
- git-svnでSVN→Gitへの移行をやってみたログ
- git svn で毎回パスワードを聞かれないようにするには
- Windowマシンで行う git-svnでのSubversionからGitへの移行方法