-

間違ってしまったコミットログコメントを後で変更する

Subversionを使っていてたまに、コミットした後にログの間違いに気がついて、あーーってなることがあります。これを救済する仕組みについて。
svnのログコメントは、リポジトリ全体のリビジョンプロパティ(revprop)である svn:log としてつけられるので、これを書き換えればOK。

revpropの変更はデフォルトでは有効になっておらず、フックスクリプトリポジトリディレクトリの中のhooksディレクトリにあるスクリプト)を用意する必要があります。
pre-revprop-changeフックスクリプトはrevprop変更の前に実行されるスクリプトで、終了ステータスが

  • 0(成功) ... revprop-changeを続行する
  • それ以外(失敗) ... revprop-changeを失敗させる

となります。
hooksにあらかじめ入っているテンプレートは、svn:logだけは変更を許可するようなExampleになっているので、参考にできるしこのまま使うこともできる。

 % cd /path/to/repos/hooks
 % mv pre-revprop-change.tmpl pre-revprop-change
 % chmod +x pre-revprop-change

pre-revprop-changeの中身(抜粋):

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then exit 0; fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1


ここまでの作業は初回のみ。このあと2通りの方法のどちらかでsvn:logを変更できます。

  1. svn propedit や svn propset
  2. svnadmin setlog

svn propedit/propset

上記のpre-revprop-changeをやっておけば、こちらが普通だと思います。
(working copyで)

 % svn propedit svn:log --revprop -r 100
(エディタで編集)

とか

 % svn propset svn:log --reprop -r 100 "ほげほげ"

svnadmin setlog

こっちは管理者が強制的にログを変更、というイメージ。
(リポジトリのあるマシン上で)
ログメッセージを含むファイル(↓ではmessage.txtとして)を用意。

 % svnadmin setlog /path/to/repos -r 100 message.txt

svnadminは、このコマンドはリポジトリのあるマシンに直接アクセスできる管理者しか使えません。それに、オプション --bypass-hooks をつけて、上記のフックスクリプトをいじらなくても強制的にやることも可能。
svn propedit/propsetの方は、管理者が一度フックスクリプトをいじっておき、管理者以外の人に変更を許可するときに使います。スクリプトで調整できるので誰でも変更可能にすることもできるし、人によって制限、パスによって制限、とか適当にいろいろ可能です。


***

そんな感じで、こないだ、ミスったコミットログコメントをあとから直しました。書いたら長くなるなやっぱ。

ちなみに、revpropはリビジョンに対して付くプロパティで、普通のプロパティがファイルやディレクトリのプロパティなのに対して、リビジョンプロパティは「リビジョン」のプロパティ。(svn:logのほかにはsvn:date, svn:authorがある。)
リビジョンにひも付いたプロパティである以上、バージョン管理はされない(というか、できない)。変えたら前の状態は完全になくなる。
(逆に言うと、普通のプロパティは、バージョン管理されている = プロパティの状態もリビジョンごとに保存されている。昔のリビジョンをチェックアウトしたらプロパティもそのときの状態になってるということ。)


ただまあ、ログは「あとから変更できるしー」みたいな感じで思ってたらまともに書かなくなるし、基本的に修正できないもの、と思って書くようにしたほうがよさげ。この方法は非常手段で。
そういう意味でも、チームで開発しているときに、コミットの瞬間MLに流すコミットメールは意味がある。読まれることを意識して書くから。