Subversionで特定のリビジョンのログメッセージを編集する方法はありますか?私は誤って間違ったファイル名を自分のコミットメッセージに書いてしまいましたが、後で混乱を招く可能性があります。
Gitで誤ったコミットメッセージを編集するにはどうすればよいですか?その質問はSubversionには似ていないようです(svn help commit
)。
これを行うには、基本的に、リポジトリに対して(直接的または間接的に)管理者権限が必要です。すべてのユーザーがこれを実行できるようにリポジトリを設定することも、サーバー上で直接ログメッセージを変更することもできます。
Subversion FAQ の この部分 を参照してください(強調)。
ログメッセージは各リビジョンに付随するプロパティとしてリポジトリに保存されます。 デフォルトでは、ログメッセージプロパティ(svn:log)はコミットされると編集できません。これは、リビジョンプロパティ(svn:logが1)を変更すると、そのプロパティの以前の値が永久に破棄され、Subversionが誤ってこれを行わないようにするためです。しかし、Subversionにリビジョンプロパティを変更させる方法はいくつかあります。
最初の方法は、リポジトリ管理者がリビジョンプロパティの変更を有効にすることです。これは "pre-revprop-change"と呼ばれるフックを作成することによって行われます(これを行う方法についての詳細はSubversion bookのこのセクションを見てください)。 "pre-revprop-change"フックは変更される前に古いログメッセージにアクセスできるので、何らかの方法でそれを保存することができます(例えば、Eメールを送ることによって)。リビジョンプロパティの変更が有効になったら、--revpropスイッチをsvn propeditまたはsvn propsetに渡すことでリビジョンのログメッセージを変更することができます。
$svn propedit -r N --revprop svn:log URL $svn propset -r N --revprop svn:log "new log message" URL
nはログメッセージを変更したいリビジョン番号、URLはリポジトリの場所です。作業コピー内からこのコマンドを実行する場合は、URLを省略することができます。
ログメッセージを変更する2番目の方法はsvnadmin setlogを使うことです。 これはファイルシステム上のリポジトリの場所を参照して行わなければなりません。このコマンドを使用してリモートリポジトリを変更することはできません。
$ svnadmin setlog REPOS_PATH -r N FILE
ここで、REPOS_PATHはリポジトリの場所、Nは変更したいログメッセージのリビジョン番号、そしてFILEは新しいログメッセージを含むファイルです。 "pre-revprop-change"フックが設定されていない場合(または何らかの理由でフックスクリプトを回避したい場合)、--bypass-hooksオプションを使用することもできます。ただし、このオプションを使用することにした場合は、細心の注意を払ってください。あなたは、変更のEメール通知や、リビジョンのプロパティを追跡するバックアップシステムなどのものを迂回しているかもしれません。
このコマンドを実行すると、
svn propedit svn:log --revprop -r NNN
念のため、このメッセージが表示されたら:
DAV要求が失敗しました。リポジトリのpre-revprop-changeフックが失敗したか存在しない可能性があります。
その理由は、Subversionがログメッセージを修正することを許可していないからです。
Subversionサーバーのhooksディレクトリに移動します(〜/ svn/reponameをリポジトリのディレクトリに置き換えます)。
cd ~/svn/reponame/hooks
拡張子を削除する
mv pre-revprop-change.tmpl pre-revprop-change
実行可能にします(chmod + xはできません!)
chmod 755 pre-revprop-change
Hooksディレクトリ内のテンプレートファイルはUnix固有のものであるため使用できません。 Windowsのバッチファイルpre-revprop-change.bat
をhooksディレクトリにコピーする必要があります。ここで提供されているもの。
これは私がよくある質問で触れていない便利なバリエーションです。テキストエディタを指定して、現在のメッセージを編集用に返すことができます。
svn propedit svn:log --revprop -r N --editor-cmd vim
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
私も最近これを任されました。
私達は私達のプログラマーが彼ら自身のコミットメッセージだけを変更することを許可し、そして彼らが変更を許可されるまでどれだけさかのぼって制限したいと思いました。タイプミスなどを修正するために、その日にコミットされたログメッセージを変更することを許可することにしました。
オンラインで他のいくつかの例を見た後、私はこれを一緒にハックしました。私たちはWindows環境にいるので、これがpre-revprop-change.bat
の内容です。
@ECHO OFF
set repos=%1
set rev=%2
set user=%3
set propname=%4
set action=%5
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow changes to svn:log. The author, date and other revision
:: properties cannot be changed
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%propname%'=='svn:log' goto ERROR_PROPNAME
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow modifications to svn:log (no addition/overwrite or deletion)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%action%'=='M' goto ERROR_ACTION
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow user to modify their own log messages
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set AUTHOR=
for /f "delims=" %%a in ('svnlook author -r %REV% %REPOS%') do @set AUTHOR=%%a
if /I not '%AUTHOR%'=='%user%' goto ERROR_WRONGUSER
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow user to modify log messages from today, old messages locked down
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set DATESTAMP=
for /f "delims=" %%a in ('svnlook date -r %REV% %REPOS%') do @set DATESTAMP=%%a
for /F "tokens=1-2 delims= " %%a in ("%DATESTAMP%") do (
set DATESTAMPDATE=%%a
set DATESTAMPTIME=%%b )
:: Expects DATESTAMPDATE in the format: 2012-02-24
for /F "tokens=1-3 delims=-" %%a in ("%DATESTAMPDATE%") do (
set DATESTAMPYEAR=%%a
set DATESTAMPMONTH=%%b
set DATESTAMPDAY=%%c )
:: Expects date in the format: Thu 08/01/2013
for /F "tokens=1-4 delims=/ " %%a in ("%date%") do (
set YEAR=%%d
set MONTH=%%b
set DAY=%%c )
if /I not '%DATESTAMPYEAR%'=='%YEAR%' goto ERROR_MSGTOOOLD
if /I not '%DATESTAMPMONTH%'=='%MONTH%' goto ERROR_MSGTOOOLD
if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Make sure that the new svn:log message contains some text.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
set bIsEmpty=false
)
if '%bIsEmpty%'=='true' goto ERROR_EMPTY
goto :eof
:ERROR_EMPTY
echo Empty svn:log properties are not allowed. >&2
goto ERROR_EXIT
:ERROR_PROPNAME
echo Only changes to svn:log revision properties are allowed. >&2
goto ERROR_EXIT
:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT
:ERROR_WRONGUSER
echo You are not allowed to modify other user's log messages. >&2
goto ERROR_EXIT
:ERROR_MSGTOOOLD
echo You are not allowed to modify log messages older than today. >&2
goto ERROR_EXIT
:ERROR_EXIT
exit /b 1
編集:このためのオリジナルのアイデアは、このスレッドから来た:
Windowsでは、Tortoise SVNクライアントを使用します。
それがうまくいかない場合は、サーバー上のSVNの設定方法が原因である可能性があります。ここで他の応答を読んでください。
EclipseのようにIDEを使用している場合は、この簡単な方法を使用できます。
Right click on the project -> Team - Show history
そのright click on the revision id for your commit and select 'Set commit properties'
に。
ここからメッセージを自由に変更できます。
リポジトリでpre-revprop-changeフックを介してリビジョンプロパティを設定できるようになっていれば、ログメッセージをより簡単に変更できます。
svn propedit --revprop -r 1234 svn:log url://to/repository
あるいはTortoiseSVN、AnkhSVN、そしておそらく他の多くのSubversionクライアントでログエントリを右クリックしてから 'ログメッセージを変更'してください。
Subversion FAQ はこれをカバーしていますが、実際の例を示すことなくREPOS_PATH
のような未定義の用語を混同しています。
それを機能させるのに数回かかるかもしれないので、あなたの更新されたコミットメッセージをファイルに保存してください。 svn-commit.tmp
ファイルとは異なり、問題がある場合はSubversionは入力内容を保存しません。
作業ディレクトリで、次のコマンドを実行します。
svn propedit -r N --revprop svn:log
コミットメッセージを編集します。それがうまくいけば、すごい! svn:log
リビジョンプロパティはバージョン管理されておらず、Subversionはデフォルトで フックスクリプトpre-revprop-change
を使って上書きするのをやめます。そのようなフックはありません。
フックを変更するには、リポジトリがホストされているファイルシステムにアクセスする必要があります。 svn info
はリポジトリルートを教えてくれます。 ~/svnrepo
だとします。
cd
から~/svnrepo/hooks
pre-revprop-change
またはpre-revprop-change.bat
スクリプトはありますか?もしそうなら、一時的にsvn:log
を変更しようとすると中止される部分をコメントアウトしてください。それ以外の場合は、Windows上でpre-revprop-change.bat
という名前の空のファイルを作成します。これを実行する1つの方法は次のとおりです。
copy con pre-revprop-change.bat
^Z
それ以外の場合、Unixでは、次のコマンドを実行してください。
echo '#!/bin/sh' > pre-revprop-change
chmod +x pre-revprop-change
作業コピーで、svn propedit -r N --revprop svn:log
をもう一度実行します。
~/svnrepo/hooks/svn-revprop-change
(.bat
)への変更を元に戻します