svnのログメッセージを変更する

svnでうっかりログメッセージをtypoしてしまったりすることがある。ソース自体は問題がないのでもう一度修正コミットをするのも気が進まない。
そういうときのためかは知らないがメッセージを変更する機能はある。ただし前のメッセージが永久に消えてしまうため、クライアントのみではできない。リポジトリ側での操作が必要になる。

一度だけsvnadminで変更する場合

svnadminコマンドは操作に失敗すると取り返しがつかないので変更前にダンプかログを保存しておく。

cd /path/to/repo
svnadmin setlog . -r REV NEW_MESSAGE_FILE --bypass-hooks

ファイル NEW_MESSAGE_FILE にメッセージを書く。標準入力からの読み込みはできない雰囲気だった。
pre-revprop-changeフック(後述)を設定していない場合は--bypass-hooksが必要になる。

クライアントから変更できるようにする場合

度々修正する場合はクライアントから操作できるようにする。問題があるのはコミッターの方なのだが、そちらをfixできるとは限らないわけだ。
まずリポジトリ側を変更する。pre-revprop-changeフックを設定すればよい。用意されているテンプレートスクリプトが丁度ログ(svn:log)の変更のみを許可するようになっているので、これを使う。

cd /path/to/repo
cp hooks/pre-revprop-change.tmpl hooks/pre-revprop-change

このままでは書き込み権限のあるユーザは誰でもログを変更できてしまう。
必要に応じてexit 0しているif行に-a "$USER" = "USER_NAME"などを追加する。

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

フックスクリプト側で古いメッセージをどこかにダンプするのも良いかもしれない。
最後に実行権限を付けて有効化する。

chmod +x hooks/pre-revprop-change

あとはクライアント側で対象のリビジョン番号を確認して、新しいメッセージを設定する。

svn log -r REV # OLD MESSAGE
svn propset -r REV --revprop svn:log "NEW MESSAGE"
svn log -r REV # NEW MESSAGE