SubversionからGit(GitLab)へ移行
メインの開発はGitに移行したときの覚書。
一つのsvnリポジトリでドキュメント、Web・アプリ用のソースコードを管理していたので、コードの部分だけGitに移行してドキュメントはSubversionに残す。
目標はGitHub Flowの実現。
クライアント環境: Windows 8.1 x64, Git-1.9.5-preview20150319, TortoiseGit-1.8.14.0-64bit
サーバー環境: CentOS 6.6, Ruby 2.2.2, Git 2.4.1, GitLab 7.10.4
参考
目次
- 移行しやすいようにsvnリポジトリのディレクトリ構成を変える
- GitLabに移行先プロジェクト作成
- svnユーザーとgitユーザーのマッピングファイルを作る
- Subversionリポジトリから変換(git svn clone)
- Subversionリポジトリから変換(svn2git)
- GitLabにPush
1.移行しやすいようにsvnリポジトリのディレクトリ構成を変える
1つのリポジトリでドキュメント、ウェブ、アプリを管理していたので、ブランチも多階層になってた。
「git svn init --ignore-paths="(/hoge)"」などで頑張ったけど、うまい正規表現が書けなかったので、ウェブとアプリでsvnリポジトリを分けて、git svnしやすいリポジトリに変更することにした。
まずは元のリポジトリをコピー
# cd /home/svn/Repositories/
# svnadmin hotcopy hoge_project/ hoge_project_web --clean-logs
# chown apache. -R hoge_project_web/
あとはTortoiseSVNのリポジトリブラウザで削除したりコピーしたりする。
2.GitLabに移行先プロジェクト作成
GitLabでプロジェクトを新規作成しておく。
GitLabのインストールは前の記事を参考に。
3.svnユーザーとgitユーザーのマッピングファイルを作る
ユーザー一覧のファイルを出力する。適当なsvn checkoutしている開発環境で下記コマンドを実行。
# svn log ^/ --xml | grep -P "^<author" | sort -u | perl -pe 's/<author>(.*?)<\/author>/$1 = /' > users.txt
出力されたユーザー一覧をコピーしてきて編集。
daiki = suganuma <suganuma@hoge.jp>
4.Subversionリポジトリから変換(git svn clone)
svn2gitを使うことにしたので、この章はただのログ。
Windows上でGit Bashを起動して作業用フォルダに移動
$ cd /d/Documents/Projects/GitLab/
svn initして変換先の準備
$ git svn clone http://svn.hoge.jp/repos/hoge_project_web/ --no-metadata --trunk=trunk/source_web --authors-file=users.txt --prefix=origin/ --stdlayout hoge_project_web
削除した分までログを取得しているみたいで処理に時間がかかる。
タグの変換
$ cd hoge_project_web
$ git for-each-ref refs/remotes/tags | cut -d / -f 4- | grep -v @ | while read tagname; do git tag "$tagname" "tags/$tagname"; git branch -r -d "tags/$tagname"; done
ブランチの変換
$ git for-each-ref refs/remotes | cut -d / -f 3- | grep -v @ | while read branchname; do git branch "$branchname" "refs/remotes/$branchname"; git branch -r -d "$branchname"; done
確認
$ git branch -a
$ git tag -n
タグがブランチになっている。
svn2gitを使うといい感じに変換してくれそうだったのでこちらを試すことにした。
5.Subversionリポジトリから変換(svn2git)
インストール方法は公式サイトを参考に。
GitLabがインストールされたサーバーで実行した。Rubyのインストールは前の記事を参考に。
作業ディレクトリを作る
# mkdir /home/svn
# cd /home/svn
インストール
# gem install svn2git
ユーザーの変換ファイルを作る
# vi users.txt
オプションの詳細は公式サイトを参考に。
# mkdir hoge_project_web
# cd hoge_project_web
タグが必要ない場合
# svn2git http://svn.hoge.jp/repos/hoge_web/ --authors ../users.txt --trunk trunk/source_web --notags
途中で止まった。「commnad failed: git gc」あるのでやってみる。
# git gc
移行自体は成功した様子。
確認
# git branch -a
# git tag -n
削除したはずの余計なブランチがあるので削除
# git branch -d hoge
マージしてないブランチを強制的に削除
# git branch -D hoge
「svn」リモートブランチは気にしない
@のついたタグを削除
# git tag -l | grep @ | xargs git tag -d
関係ないタグを削除
# git tag -l | grep source_hoge | xargs git tag -d
6.GitLabにPush
GitLabにPushするためにSSHの設定
Windowsで作成したプライベートキーを変換するツールのインストール
# yum install putty
プライベートキーをid_rsa.gitlab.ppkとして保存。OpenSSH形式に変換
# cd ~/.ssh/
# puttygen id_rsa.gitlab.ppk -O private-openssh -o id_rsa.gitlab
# chmod 600 ~/.ssh/id_rsa.gitlab
SSH Configの設定
# vi config
Host gitlab.hoge.jp
HostName gitlab.hoge.jp
User git
IdentityFile ~/.ssh/id_rsa.gitlab
Port 22
GitLabのプロジェクトをリモートリポジトリとして追加
# git remote add origin git@gitlab.hoge.jp:suganuma/hoge-web.git
確認
# git remote -v
Push
# git push origin --all
# git push origin --tags
GitLab上で確認
< Related Posts >