読者です 読者をやめる 読者になる 読者になる

@numa08 猫耳帽子の女の子

明日目が覚めたら俺達の業界が夢のような世界になっているとイイナ。

SubversionとGit中央リポジトリのコードを綺麗に取得する方法

f:id:numanuma08:20140321013903j:plain

ソースコードのバージョン管理に、gitを採用しているプロジェクトは多いかもしれませんが、現在でもSubversionを利用している場合も多いと思います。

その理由は様々で、プロジェクトによってはSubversionの方が優位性のあるケースもあるだろうし、技術スキル的な理由だったり、Subversionに依存するツールを利用していたり、もしかしたら政治的な理由だったりするかもしれません。

しかし、世の中にはgit-svnという物もあったりしてある程度GitとSubversion共存ができます。

さて、これで平和になった気がしますが世の中には更なる闇があるようです。それは、Git中央リポジトリSubversionリポジトリを併用する必要がある場合。

図で書くとこんな感じ。

f:id:numanuma08:20140321020023p:plain

そんな環境あるの?と思えないでもないですが、どうやら存在するようです。

前置きが長くなりましたが、Git中央リポジトリSubversionリポジトリの両方のソースコードがあり、両方共を取得する方法です。

それが闇と言うのなら、我らは闇をもって闇を制す

正直、.gitディレクトリ以下を操作するのって、闇への第一歩って感じがするのであまりやりたくないのですが・・・。

実は、何も考えずに次のコマンドでSubversionとGit中央リポジトリのコードを取得するのはマチガイです。

git clone ${GIT_URL} ${locacl_repository}
cd ${locacl_repository}
git svn init ${SVN_URL}
git svn fetch

上記のコマンドでソースコード自体の取得はできるのですが、GitのログのハッシュとSubversionのログのハッシュが異なったものになる問題があります。

そのため、同じコミットでも別のコミットとして扱われてしまい、運用をすることが困難になります。

対応するには、SubversionのハッシュをGitのハッシュと合わせる必要があります。そして、それは以下のコマンドで実現可能です。

git clone ${GIT_URL} ${locacl_repository}
cd ${locacl_repository}
git svn init ${SVN_URL}
git show origin/master | head -n 1 | awk '{print $2}' > .git/refs/remotes/git-svn
git svn fetch

git show origin/master | head -n 1 | awk '{print $2}' > .git/refs/remotes/git-svnがミソで、Subversionの先頭とGitのHEADのハッシュを合わせてからfetchを行うといい感じにコードの取得ができます。

こんな悲しい感じのことをしなくてもいい、平和な世界が訪れることを願って止みません。