Subversionで特定のリビジョンのログメッセージを編集する方法はありますか?コミットメッセージに誤って間違ったファイル名を書き込んだため、後で混乱する可能性があります。
Gitで間違ったコミットメッセージを編集するにはどうすればよいですか?、しかし、その質問に対する解決策は、Subversionの場合と同様ではないようです(によるとsvn help commit
)。
Subversionで特定のリビジョンのログメッセージを編集する方法はありますか?コミットメッセージに誤って間違ったファイル名を書き込んだため、後で混乱する可能性があります。
Gitで間違ったコミットメッセージを編集するにはどうすればよいですか?、しかし、その質問に対する解決策は、Subversionの場合と同様ではないようです(によるとsvn help commit
)。
基本的に、これを行うには、リポジトリに対する管理者権限(直接的または間接的)が必要です。すべてのユーザーがこれを実行できるようにリポジトリを構成するか、サーバー上でログメッセージを直接変更することができます。
Subversion FAQのこの部分を参照してください(私の強調):
ログメッセージは、各リビジョンに添付されたプロパティとしてリポジトリに保持されます。デフォルトでは、ログメッセージプロパティ(svn:log)は、コミットされると編集できません。これは、リビジョンプロパティ(svn:logが1つ)を変更すると、プロパティの以前の値が完全に破棄され、Subversionが誤ってこれを行わないようにするためです。ただし、Subversionにリビジョンプロパティを変更させる方法はいくつかあります。
最初の方法は、リポジトリ管理者がリビジョンプロパティの変更を有効にすることです。これは、「pre-revprop-change」と呼ばれるフックを作成することによって行われます(これを行う方法の詳細については、Subversionブックのこのセクションを参照してください)。「pre-revprop-change」フックは、変更される前に古いログメッセージにアクセスできるため、何らかの方法で(たとえば、電子メールを送信することによって)メッセージを保持できます。リビジョンプロパティの変更を有効にしたら、次のいずれかのように--revpropスイッチをsvnpropeditまたはsvnpropsetに渡すことで、リビジョンのログメッセージを変更できます。
$svn propedit -r N --revprop svn:log URL $svn propset -r N --revprop svn:log "new log message" URL
ここで、Nはログメッセージを変更するリビジョン番号であり、URLはリポジトリの場所です。作業コピー内からこのコマンドを実行する場合は、URLを省略できます。
ログメッセージを変更する2番目の方法は、svnadminsetlogを使用することです。 これは、ファイルシステム上のリポジトリの場所を参照して行う必要があります。このコマンドを使用してリモートリポジトリを変更することはできません。
$ svnadmin setlog REPOS_PATH -r N FILE
ここで、REPOS_PATHはリポジトリの場所、Nはログメッセージを変更するリビジョン番号、FILEは新しいログメッセージを含むファイルです。「pre-revprop-change」フックが設定されていない場合(または何らかの理由でフックスクリプトをバイパスしたい場合)は、-bypass-hooksオプションを使用することもできます。ただし、このオプションを使用する場合は、十分に注意してください。変更の電子メール通知や、リビジョンのプロパティを追跡するバックアップシステムなどをバイパスしている可能性があります。
このコマンドを実行すると、
svn propedit svn:log --revprop -r NNN
念のため、次のメッセージが表示されます。
DAV 要求が失敗しました。リポジトリの pre-revprop-change フックが失敗したか、存在しない可能性があります
これは、ログ メッセージはバージョン管理されておらず、永久に失われるため、Subversion ではログ メッセージを変更できないためです。
Subversion サーバーのフック ディレクトリに移動します (~/svn/reponame をリポジトリのディレクトリに置き換えます)。
cd ~/svn/reponame/hooks
拡張機能を削除します
mv pre-revprop-change.tmpl pre-revprop-change
実行可能にします (chmod +x は実行できません!)
chmod 755 pre-revprop-change
hooks ディレクトリのテンプレート ファイルは、Unix 固有であるため使用できません。pre-revprop-change.bat
Windows バッチ ファイルをフック ディレクトリにコピーする必要があります。
これは、よくある質問には記載されていない便利なバリエーションです。テキストエディタを指定することにより、編集のために現在のメッセージを返すことができます。
svn propedit svn:log --revprop -r N --editor-cmd vim
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
Windows では、Tortoise SVN クライアントを使用して:
サーバー上のSVNのセットアップ方法が原因で機能しない場合は、ここで他の回答を読んでください。
私も最近これを任されました。
私たちは、プログラマーが自分のコミット メッセージのみを変更できるようにし、その変更が許可される期間を制限したいと考えました。タイプミスなどを修正するために、その日にコミットされたログメッセージを変更することを許可することにしました。
他のいくつかの例をオンラインで見た後、これを一緒にハックしました。私たちは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
編集:これの元のアイデアは、このスレッドから来ました:
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 クライアントでは、ログ エントリを右クリックしてから「ログ メッセージを変更」します。