LoginSignup
18
19

More than 5 years have passed since last update.

SubversionからGitへ移行してみた

Last updated at Posted at 2015-10-28

結構はまったし、後日別のリポジトリを移行することがありそうなのでメモを残しておきます。

前提・事前準備

  • 一旦、ローカルの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のユーザ名=会社のメールアドレスだったのですんなり作成できました。

こんなファイルが出力されます。

svnauthors.txt
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でハマるようですが、
今回はかなりキレイに移行することが出来ました。

参考リンク


  1. こちらの記事を参照 

  2. こちらの記事のワンライナーを参考にさせて貰いました 

18
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
19