ソースコードのバージョン管理に、gitを採用しているプロジェクトは多いかもしれませんが、現在でもSubversionを利用している場合も多いと思います。
その理由は様々で、プロジェクトによってはSubversionの方が優位性のあるケースもあるだろうし、技術スキル的な理由だったり、Subversionに依存するツールを利用していたり、もしかしたら政治的な理由だったりするかもしれません。
しかし、世の中にはgit-svnという物もあったりしてある程度GitとSubversionは共存ができます。
さて、これで平和になった気がしますが世の中には更なる闇があるようです。それは、Git中央リポジトリとSubversionリポジトリを併用する必要がある場合。
図で書くとこんな感じ。
そんな環境あるの?と思えないでもないですが、どうやら存在するようです。
前置きが長くなりましたが、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
を行うといい感じにコードの取得ができます。
こんな悲しい感じのことをしなくてもいい、平和な世界が訪れることを願って止みません。