(注:このブログはもう更新していません)この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

[クラウド帳票エンジンDocurain]

svn:externalsがGitで欲しい → GitとSVNを同時に使え

Gitは便利ですが、SVNよりも使いづらい(※少なくとも僕の使い方では)面がいくつかあります。

その最たるモノは svn:externals です。 他のリポジトリから特定のディレクトリやファイル単位でチェリーピック的に引っ張ってくることができる、この機能を僕は多用しており、 これはGitのsubmoduleやsubtreeとは違います。

takahashikzn.root42.jp

で、このために手元のいくつかのリポジトリをGitへ移行できずにいましたが、 昨晩思いつきました。そう、GitとSVNを同時に使えば良いと。

具体的にどうしたか

git-svn というのがあるようですが、僕がやりたいのは単にGitとSVNに同時にcommitしたいというだけ。 なので、

  1. それぞれのVCSで、それぞれのメタデータファイル( .svn.git )を無視し合う (svn:ignore.gitignoreに設定)

  2. 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を正とし、SVNsvn:externals 専用としてコミットしています。 これで大体やりたいことができるようになりました。

追記

git branch をしたときのことは考えてません。僕の使い方だと、ほとんどの作業対象はメインブランチなので。