この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
たろちゃんです。SourceForge.JP のプロジェクトをSubversionからGitへ移行しましたのでその時に記録から手順を紹介します。
僕が現在開発しているエレコマはSourceForge.JPにてホスティングを行っており、開発リソースをすべて一元管理しております。
開発当初、弊社内のレポジトリがSubversionであった事や僕自身にSubversionの運用ノウハウがあったことからSourceForge.JPでもSubversionを採用していました。
しかしながら、Railsのプロジェクトという特性からか、何人かgit-svnを利用している方がおり、また開発に集中するという意味でもGitの方が魅力的であるため、今回SubversionからGitへ移行しました。
まずはGit自体を有効にします。Gitを有効にするためにはSourceForge.JPへ管理者としてログインしてからプロジェクトのメニューの「管理」から「プロジェクト情報変更」を選択して「プロジェクト情報変更画面」を出します。この中にある「利用する機能」にあるGitを利用のチェックボックスを有効にして情報を保存します。
続いてプロジェクトのメニューの「ソースコード」から「Git管理」を選択して、「新規Gitレポジトリを作成」というリンクを辿り、必要な情報を入力をしてGitレポジトリを作成します。数分のち、作成済が解除され、レポジトリが有効になります。
エレコマの場合は以下の内容で生成されました。
git clone tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
では、さっそく移行作業を開始しましょう。
まずは作業用ディレクトリを作成し、移動します。
$ mkdir -p ~/develop/elecoma/tomove_git
$ cd ~/develop/elecoma/tomove_git
次にgit svn cloneを使ってSubversionのデータをすべて取得します。–prefixには svn/ を追加してリモートレポジトリをわかりやすくします。
$ git svn clone --prefix svn/ -s svn+ssh://tmatsuzawa@svn.sourceforge.jp/svnroot/elecoma/
そしてgit remote add を使ってSourceForge.jpのGitレポジトリを追加します。リモートレポジトリの名前はoriginとします。
$ cd elecoma
$ git remote add origin tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
あとはmasterの内容をリモートレポジトリ(origin)へ push します。念のため –dry-run をつけて内容を確認しておくとよいでしょう。
$ git push origin master --dry-run
(初回実行時にgit.sourceforge.jpをsshのknown_listへ追加するか確認されます)
To tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
* [new branch] master -> master
$ git push origin master
Counting objects: 2581, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2504/2504), done.
Writing objects: 100% (2581/2581), 6.94 MiB | 2.83 MiB/s, done.
Total 2581 (delta 1006), reused 0 (delta 0)
To tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
* [new branch] master -> master
以上で、masterの内容をリモートレポジトリへすべて push しました。しかし、エレコマではリリースごとに tag を切っていますので、こちらも反映します。
Subversionでの tag はGitにおいては branch に相当します。まずはリモートの branch を確認します。
$ git branch -r
origin/master
svn/1.0.x
svn/tags/1.0.6
svn/tags/1.0.7
svn/tags/release-1.0.1
svn/tags/release-1.0.2
svn/tags/release-1.0.3
svn/tags/release-1.0.4
svn/tags/release-1.0.5
svn/trunk
この場合は svn/tags/release-1.0.1 という branch がGitにおける tag に相当します。なので、branch に移動して tag を切ってそれを push していきます。
$ git checkout svn/tags/release-1.0.1
$ git tag 1.0.1
$ git push --tags origin --dry-run
To tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
* [new tag] 1.0.1 -> 1.0.1
$ git push --tags origin
Counting objects: 1, done.
Writing objects: 100% (1/1), 266 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
* [new tag] 1.0.1 -> 1.0.1
これで tag が切れました。他の tag も同様に作業をしていきます。
$ git checkout svn/tags/release-1.0.2
$ git tag 1.0.2
$ git push --tags origin
Counting objects: 2, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 454 bytes, done.
Total 2 (delta 1), reused 0 (delta 0)
To tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
* [new tag] 1.0.2 -> 1.0.2
.
.
.
$ git checkout svn/tags/1.0.7
$ git tag 1.0.7
$ git push --tags origin
Counting objects: 1, done.
Writing objects: 100% (1/1), 259 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To tmatsuzawa@git.sourceforge.jp:/gitroot/elecoma/elecoma.git
* [new tag] 1.0.7 -> 1.0.7
以上ですべての tag が切れました。
あとは、別のディレクトリで git clone をして確認をしましょう。
なお、エレコマでは 1.0.x という branch も存在していましたが、 git ではリリースされたものに対しては branch を用意する必要がないためこのままにしておきます。必要に応じて、以下のようにして branch を作成して作業をするとよいでしょう。
$ git branch RB_1.0.7_1 1.0.7
なお、このテクニック自体はSourceForge.JP以外でも使えると思います。SubversionからGitに移行を検討している方はぜひ参考にしてください。
さて、これで2.x系の開発が…はかどるといいなぁ…