ホーム DoRuby SourceForge.JP のプロジェクトを Subversion から Git へ移行する

SourceForge.JP のプロジェクトを Subversion から Git へ移行する

この記事はアピリッツの技術ブログ「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系の開発が…はかどるといいなぁ…

記事を共有

最近人気な記事