その他
    ホーム 技術発信 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系の開発が…はかどるといいなぁ…