Gitは便利ですが、SVNよりも使いづらい(※少なくとも僕の使い方では)面がいくつかあります。
その最たるモノは svn:externals
です。
他のリポジトリから特定のディレクトリやファイル単位でチェリーピック的に引っ張ってくることができる、この機能を僕は多用しており、
これはGitのsubmoduleやsubtreeとは違います。
で、このために手元のいくつかのリポジトリをGitへ移行できずにいましたが、 昨晩思いつきました。そう、GitとSVNを同時に使えば良いと。
具体的にどうしたか
git-svn
というのがあるようですが、僕がやりたいのは単にGitとSVNに同時にcommitしたいというだけ。
なので、
それぞれのVCSで、それぞれのメタデータファイル(
.svn
と.git
)を無視し合う (svn:ignore
と.gitignore
に設定)post-commitのフックに以下のようなスクリプトを書く
#!/bin/bash ## mainブランチのみ [ "`git branch --show-current`" != 'main' ] && exit svn st | grep '^\?' | perl -pe 's!\?[ ]*!svn add !g' | perl -pe 's!\\!/!g' | sh svn st | grep '^\!' | perl -pe 's!\![ ]*!svn del !g' | perl -pe 's!\\!/!g' | sh svn ci . -m 'sync with git'
つまりGitを正とし、SVNは svn:externals
専用としてコミットしています。
これで大体やりたいことができるようになりました。
追記
git branch
をしたときのことは考えてません。僕の使い方だと、ほとんどの作業対象はメインブランチなので。