SubversionからGit(GitLab)へ移行

subversion_gitメインの開発は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

 

参考

 

目次

  1. 移行しやすいようにsvnリポジトリのディレクトリ構成を変える
  2. GitLabに移行先プロジェクト作成
  3. svnユーザーとgitユーザーのマッピングファイルを作る
  4. Subversionリポジトリから変換(git svn clone)
  5. Subversionリポジトリから変換(svn2git)
  6. 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 >