Subversionで既にコミットされたログメッセージを編集する方法は?
質問
Subversionの特定のリビジョンのログメッセージを編集する方法はありますか?コミットメッセージに間違ったファイル名を誤って書いたので、後で混乱する可能性があります。
見た方法Gitで間違ったコミットメッセージを編集しますか 、しかしその質問に対する解決策はSubversionに似ていないようです( svn help commit
による)。
解決
これを行うには、本質的に、リポジトリに対する管理者権限(直接または間接)が必要です。すべてのユーザーがこれを行えるようにリポジトリを構成するか、サーバーでログメッセージを直接変更できます。
ログメッセージは 添付プロパティとしてのリポジトリ 各リビジョン。 デフォルトでは、ログ メッセージプロパティ(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オプションを使用します。 ただし、これを使用することにした場合 オプション、非常に注意してください。あなたはかもしれない メールなどをバイパスする 変更の通知、またはバックアップ 改訂を追跡するシステム プロパティ。
他のヒント
このコマンドを実行すると、
svn propedit svn:log --revprop -r NNN
このメッセージが表示された場合に備えて:
DAV要求が失敗しました。それは可能です リポジトリのpre-revprop-change フックが失敗したか存在しないかのいずれか
ログメッセージはバージョン管理されておらず、永久に失われるため、Subversionではログメッセージを変更できません。
UnixがホストするSVN
Subversionサーバーのhooksディレクトリに移動します(〜/ svn / reponameをリポジトリのディレクトリに置き換えます)
cd ~/svn/reponame/hooks
拡張機能を削除
mv pre-revprop-change.tmpl pre-revprop-change
実行可能にする(chmod + xを実行できない!)
chmod 755 pre-revprop-change
WindowsがホストするSVN
hooksディレクトリ内のテンプレートファイルは、Unix固有であるため使用できません。 Windowsバッチファイル pre-revprop-change.bat
をhooksディレクトリにコピーする必要があります。 1つはこちらで提供されています。
これは、よくある質問で言及されていない便利なバリエーションです。テキストエディタを指定することで、編集のために現在のメッセージを返すことができます。
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
そのコミットのリビジョンIDを右クリックし、「コミットプロパティの設定」
を選択します。
ここから必要に応じてメッセージを変更できます。
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
)への変更を元に戻します