2016-02-22T18:14:24+09:00

Subversion から Git に移行する時の教訓

これまで、ローカルの Subversion を使ってコードのバージョン管理を行ってきたけど、Git への移行作業を行っている。Git に移行する一番のモチベーションは github でレボジトリを公開できる事。そして、ソースコードのアーカイブを作成作業をさぼろうと思って。

率直にいえば、ソースコードを公開してみても大したフィードバックがある訳でもなく、その手応えはさっぱりで、何の意味があるのか?とときどき思う。と言いつつも、自分も色んな人のコードを除いている割には対してフィードバックしていない。きっと、自分のコードも与り知らぬ所で誰かの役に立っていると信じて、頑張ってソースコードを公開しよう。

いくつもの project を抱えており、たくさんのレボジトリを Subversion のレボジトリから切り出し、github に公開しているレポジトリの数は 70 を越えた。ほとんどの project を移行し終わった時点で、ようやくノウハウが溜まった。始めの頃は、間抜けさに気付かず不完全なレポジトリの変換しかできなかった。以下の知識がはじめからあれば、苦労は無かったのに、と思う。

git svn ではなく svn2git を使う

あくまでSubversion には戻らない、Git への一方通行の変換の場合です。git svn では Subversion のレポジトリに push できるように、Subversion でのタグはリモートのブランチとし扱われ、git のタグにはならない。

一方、svn2git は Subversion のタグを Git のタグに変換してくれます。

trunk と tag と branch の directory をすべて指定する

普通、Subversion レボジトリのレイアウトは、

となっているよね?svn2git も git svn もデフォルトではこのレイアウトではなく、

というレイアウトがデフォルトの設定になっている。だから、一つ目のレボジトリレイアウトから、 project1 を引っこ抜くには、

$project=project1; mkdir ${project}; cd ${project}
svn2git ${SVNREPOS} --authors ../authors.txt \
                    --trunk /${project}/trunk \
                    --tags /${project}/tags \
                    --branches /${project}/branches  

というように、trunk と tags と branches のすべてのdirectory を指定する必要がある。これをしないと、タグとブランチが失われるぞ

git push --all と git push --tags を忘れない

git push で github にローカルレポジトリを公開したとします。でも、これだけでは現在のブランチ(普通は master)以外のブランチとタグすべてが push されていません。git push だけだと、現在のブランチのコミットしかリモートに送られません。git push --all と git push --tags を忘れて、リモートから clone し直したりすると、ブランチとタグがすべて失われてしまいます。