Island Life

< らむ太の発見 | Meisner intensive 2回目の1 >

2011/02/26

sf.net svn -> git 移行メモ

仕事でgitに慣れてきたら、subversionでの作業がだんだん辛くなってきた。 そこでsourceforge.netに持ってるプロジェクトの方も徐々にgitに 移行することにした。まずはWiLiKiのリポジトリで練習。

subversionからgitへの移行はgit-svnでできるみたいなんだけど、 そっくりそのまま移行してsubversionの方は忘れちゃう、というやり方が ずばり出てこなかったので若干迷った。 Chatonでokuokuさんに教えて頂いて解決。 sf.net特有の事情もあるので、手順をメモっとく。

subversion repoからのclone

git svn clone --stdlayout だとブランチへのrefがremoteに入ったりして面倒なので、 空のrepoを手元に作ってからcloneする。

$ mkdir tmp/WiLiKi.tmp
$ cd tmp/WiLiKi.tmp
$ git init

.git/configを編集してsubversion repoへの参照を足す。 足したのは以下の記述。

[svn-remote "svn"]
    url = https://wiliki.svn.sourceforge.net/svnroot/wiliki/WiLiKi
    fetch = trunk:refs/heads/master
    branches = branches/*:refs/heads/*
    tags = tags/*:refs/tags/*

subversion repoのブランチ名はそのままローカルのブランチ名へマップ。 (万が一 "master" というブランチがsubversion repoにあったらもうひと工夫要ると思う)。

あと、subversion repoのユーザ名からgitコミットログへのマップも必要。 これはこんな感じでusers.txtを用意しとく (実際には他の人もコミットしてるので そのエントリも書いてある)。

shirok = Shiro Kawai <shiro@acm.org>
shiro = Shiro Kawai <shiro@acm.org>
(no author) = Shiro Kawai <shiro@acm.org>

ちょっとはまったのは、多分古いCVSからのインポートを svnに移行したせいだと思うけど、"(no author)" というユーザ名がsubversion repo に入ってしまっていたこと。これは上のように (no author) = ... という マップを書いておけば通る。

んで、fetch。 git svnを一度も走らせずにconfigをいじったせいかちょっとした メッセージが出るけど、問題ない。

$ git svn fetch -A ../users.txt
Migrating from a git-svn v1 layout...
Data from a previous version of git-svn exists, but
        .git/svn
        (required for this version (1.7.0.4) of git-svn) does not exist.
Done migrating from a git-svn v1 layout

これでsubversion repoのブランチもタグも全部手元に来てくれる。

確認できたら、.git/configを編集して [svn-remote "svn"] セクションを消す。

sf.net側にリポジトリ作成

sf.netの ProjectAdmin > Features で Gitにチェックを入れると PROJECTNAME.git.sourceforge.net/gitroot/PROJECTNAME/PROJECTNAME というリポジトリは自動的に作ってくれるみたいなんだけど、 PROJECTNAMEの下に複数のモジュールを置く運用をしたい場合、 各モジュールのリポジトリは自分で作らないとならない。 これはsf.netのshell serviceにログインして行う。

sf.netのshellサーバ、昔は単にsshでつなぐだけだったんだけど、 こないだの侵入事件の影響だろうか (あるいはもっと前からかも。shell service何年も 使ってなかったからな)、厳重になってた。どうやらログインする度にVMを起動して その中につながるっぽい。

ま、ともかく、sf.netのgitドキュメントの "Creating Multiple Repositories" にある指示通りに。

local$ ssh -t shirok,wiliki@shell.sourceforge.net create

Requesting a new shell for "shirok" and waiting for it to start.
queued... creating... starting...

This is an interactive shell created for user shirok,wiliki.
Use the "timeleft" command to see how much time remains before shutdown.
Use the "shutdown" command to destroy the shell before the time limit.
For path information and login help, type "sf-help".

-bash-3.2$ cd /home/scm_git/w/wi/wiliki
-bash-3.2$ mkdir WiLiKi
-bash-3.2$ git --git-dir=WiLiKi init --shared=all --bare

これでPROJECTNAMEの下にモジュールとしてWiLiKiが作られた。 Webからは http://wiliki.git.sourceforge.net/git/gitweb.cgi?p=wiliki/WiLiKi でブラウズできる。

デフォルトで作られているリポジトリの方は、使わないならシェルからrm -rf してしまっても大丈夫なようだ。ownerは"dummy"となっているがgroupが プロジェクトでwritableになっているのでプロジェクト開発者なら消せる。

sf.netにpush

先ほどローカルに持ってきたgitリポジトリからpush。

$ git remote add origin ssh://shirok@wiliki.git.sourceforge.net/gitroot/wiliki/WiLiKi
$ git config branch.master.remote origin
$ git config branch.master.merge refs/heads/master
$ git push origin master
$ git push --all
$ git push --tags

確認。

$ cd ~/src
$ mv WiLiKi WiLiKi.svn
$ git clone ssh://shirok@wiliki.git.sourceforge.net/gitroot/wiliki/WiLiKi
$ cd WiLiKi
$ git branch -a

来てる来てる。

Gaucheのリポジトリも暇を見て順繰りに移行してゆく予定。

Tags: Programming, subversion, git

Post a comment

Name: