Subversionで既にコミットされているログメッセージを編集する方法


550

Subversionの特定のリビジョンのログメッセージを編集する方法はありますか?コミットメッセージに誤ったファイル名を誤って書き込んだため、後で混乱する可能性があります。

私が見てきた私は間違ってはGitリポジトリにコミットメッセージを編集するにはどうすればよいですか?、しかしその質問の解決策はSubversionの場合と似ていないようです(によるとsvn help commit)。


26
私はこの質問に
賛成するつもり

6
コードの場合は、コメントを追加して、適切なコメントを付けて再度コミットします。間違いを反映したコメントに問題がなければ、労力ははるかに少なく、はるかに迅速です。そうでない場合は、Kamil Kisielによる解決策が明らかに正しい方法です。
マーティ

pre-revprop-changeコミットしたユーザーがコミット後最大3時間ログを変更できる優れたスクリプトがあります。これは柔軟性/正確なログとの間の優れた妥協であり、リポジトリの忠実度を維持する:wandisco.com/svnforum/threads/...
JWA

あなたがあれば、ファイルを変更するが、それでも新しいコミットメッセージを追加することはできませんあなたが行うことができますsvn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
mulllhausen

回答:


457

基本的に、これを行うには、リポジトリへの(直接または間接的に)管理者権限が必要です。すべてのユーザーがこれを実行できるようにリポジトリを構成するか、サーバーでログメッセージを直接変更できます。

Subversion FAQのこの部分を参照しください(強調は私のものです):

ログメッセージは、各リビジョンに添付されたプロパティとしてリポジトリに保持されます。デフォルトでは、ログメッセージプロパティ(svn:log)は、いったんコミットされると編集できません。これは、リビジョンプロパティ(svn:logが1)の変更により、プロパティの以前の値が永久に破棄され、Subversionが誤ってこれを行わないようにするためです。ただし、Subversionでリビジョンプロパティを変更するには、いくつかの方法があります。

最初の方法は、リポジトリ管理者がリビジョンプロパティの変更を有効にすることです。これは、「pre-revprop-change」と呼ばれるフックを作成することによって行われます(これを行う方法の詳細については、Subversion bookのこのセクションを参照してください)。「pre-revprop-change」フックは、変更される前の古いログメッセージにアクセスできるため、何らかの方法で(たとえば、電子メールを送信することによって)保存することができます。リビジョンプロパティの変更が有効になったら、次のいずれかのように、-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オプションを使用することもできます。ただし、このオプションを使用する場合は、十分に注意してください。変更の電子メール通知や、リビジョンプロパティを追跡するバックアップシステムなどをバイパスしている場合があります。


15

1
svnadminオプションsvn-change-commitの
albfan

2
ありがとう!回答から6.5年経っても有用です。:-)
マイケル

propeditメソッドは多かれ少なかれ機能しました。しかし、ログの変更を取得してリポジトリブラウザに反映させることができませんでした。Windowsでは、svnコマンドラインで更新されたログしか表示できませんでした。私は最後のステップとしてログキャッシュをリフレッシュする必要がありました:stackoverflow.com/questions/25750249/...
user_007

89

このコマンドを実行すると、

svn propedit svn:log --revprop -r NNN 

このメッセージが表示された場合に備えて:

DAV要求が失敗しました。リポジトリのpre-revprop-changeフックが失敗したか、存在しない可能性があります

これは、Subversionがバージョン管理されておらず、永久に失われるため、ログメッセージを変更することができないためです。

UnixがホストするSVN

Subversionサーバーのフックディレクトリに移動します(〜/ svn / reponameをリポジトリのディレクトリに置き換えます)

cd ~/svn/reponame/hooks

拡張機能を削除する

mv pre-revprop-change.tmpl pre-revprop-change

実行可能にします(chmod + xは実行できません!)

chmod 755 pre-revprop-change

ソース

WindowsがホストするSVN

フックディレクトリ内のテンプレートファイルは、Unix固有であるため使用できません。Windowsバッチファイルpre-revprop-change.batをフックディレクトリにコピーする必要があります(例:ここに提供されているもの)


1
大括弧で「chmod + xを実行できない」と書いたのはなぜですか?
使徒2014年

1
同じアイデアを実装する小さなスクリプトをここで作成しましたblog.mmonem.com/enable-changing-svn-log
mmonem

SVN_EDITOR、VISUALまたはEDITORは、svn propeditを使用する前に設定する必要があります
Gerd

48

これは、FAQで言及されていない便利なバリエーションです。テキストエディタを指定することにより、編集のために現在のメッセージを返すことができます。

svn propedit svn:log --revprop -r N --editor-cmd vim

17
フックが作成されている必要があります-管理者権限が必要です。 svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
マット

ログを有効にするスクリプトは次のとおり
changing

37
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt

私はGoogle Codeを使用しているので、この方法で実行できるとは思いませんが、ありがとうございます。
Jeremy Ruten、

4
これは、propeditメソッドが「Repository is not enabled to accept revision propchanges」で失敗したため、うまくいきました。ありがとう!
pfctdayelise

1
直接コマンドを与えるための+1 :-) apache.orgは現在ダウンしており、特定のリンクをたどることができません...
Rafa

この答えはより多くのポイントに値します!それを使用するためにフックを設定する必要がないので、それはより良いです。
Peri Hartman、

1
この答えのバンプは、フックを設定せずに私のために働き、ログのリビジョン「日付/時刻」も変更しませんでした。メッセージだけで、まさに私が望んでいたものでした。
segFaultCoder 2016年

17

私も最近これを任されました。

プログラマが自分のコミットメッセージのみを変更できるようにし、変更を許可する期間を制限したかったのです。私たちは、タイプミスなどを修正するために、その日にコミットされたすべてのログメッセージを変更できるようにすることを決定しました。

オンラインで他の2つの例を確認した後、これを一緒にハッキングしました。私たちは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 

編集:これの元のアイデアはこのスレッドから来ました:


7
何らかの理由で、私のシステム(Server 2012とVisualSVNを実行している)では、最後の日付チェックif /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLDで、2つの変数を二重引用符で囲む必要がありました。(それがどのくらいの時間であるかを理解するのに信じられないでしょう。)そうでなければ、「== '02'は現時点では予想外です」(月の2日目)のような結果になります。私のbatch-fuは、なぜそれが起こるのかを知るほど強力ではありませんが、他の誰かが奇妙な問題に遭遇した場合に役立つかもしれません。
Carl Bussema、

@CarlBussema:その一口をありがとう。あなたは私に大きな頭痛の種を救いました。
Daniel Szabo 2014年

1
また、用途にアメリカの日付形式上記のスクリプトは、ことに注意してください「:木2013年8月1日の形式で日付を期待されています」。したがって、それを使用しない場合、その部分を変更する必要があります。私の場合、フォーマットは「mm.dd.yy」であり、曜日はありません。
Zitrax 2015年

:それはこの素敵な答えにクールなバリエーションだstackoverflow.com/questions/6155/...
NateJ

17

Windowsでは、Tortoise SVNクライアントを使用します。

  1. プロジェクトフォルダを右クリックし、[ログを表示]を選択します
  2. [ログメッセージ]ウィンドウで、リビジョンを右クリックし、[ログメッセージの編集]を選択します

サーバー上のSVNのセットアップ方法が原因で機能しない場合は、他の応答をここで読んでください。


おかげで、+ 1の方が簡単な解決策でした。権限を持っていることが不可欠です。
theGabyRod 2017年

12

EclipseのようなIDEを使用している場合は、この簡単な方法を使用できます。

Right click on the project -> Team - Show history

その中でright click on the revision id for your commit and select 'Set commit properties'

ここから必要に応じてメッセージを変更できます。


少なくともTortoiseSVNでは、コミットログでコミットのコミットプロパティを編集しようとすると、ログメッセージを直接編集しようとするのと同じエラーメッセージで失敗します。
クリスチャンセヴェリン2014

1
「DAVリクエストが失敗しました。リポジトリのpre-revprop-changeフックが失敗したか、存在しない可能性があります。リポジトリは、リビジョンプロップチェンジを受け入れるように有効化されていません。管理者にpre-revprop-changeフックの作成を依頼してください。」しかし、私が言ったように、それはEclipseではなくTortoiseSVN(非管理者として)を使用しています。たぶん、EclipseがSVNアクセス許可をハックしてそのフックを作成しているのかもしれません。
クリスチャンセヴェリン

いや多分。日食でそれをやってみてください。
mani_nz 2014

@ ChristianSeverin、Eclipseを使用すると同じエラーメッセージが表示されます。それは確かにSubversionサーバーから来ています。
GreenhouseVeg 2017

10

リポジトリでpre-revprop-changeフックを使用してリビジョンプロパティを設定できる場合、ログメッセージをより簡単に変更できます。

svn propedit --revprop -r 1234 svn:log url://to/repository

または、TortoiseSVN、AnkhSVN、およびおそらく他の多くのSubversionクライアントでは、ログエントリを右クリックして[ログメッセージを変更]します。


2
Subclipse(Eclipse)では、「Set Commit Properties」です。
pfctdayelise

2

Subversionのよくある質問はこれをカバーしていますが、同様未定義用語を混乱の束使用するREPOS_PATH任意の実際の例を与えることなくします。

機能させるには数回の試行が必要な場合があるため、更新したコミットメッセージをファイルに保存します。svn-commit.tmpファイルとは異なり、Subversionは問題がある場合に入力を保持しません。

作業ディレクトリで、次を実行します

svn propedit -r N --revprop svn:log

コミットメッセージを編集します。それがうまくいけば、素晴らしい!ただし、svn:logリビジョンプロパティはバージョン管理されておらず、デフォルトではSubversionがフックスクリプト pre-revprop-changeまたはそのようなフックがないことを示すエラーメッセージのいずれかによる上書きを防ぐため、おそらくそうはなりません。

フックを変更するには、リポジトリがホストされているファイルシステムにアクセスする必要があります。svn infoリポジトリルートを教えてくれます。だとしましょう~/svnrepo

  1. cd~/svnrepo/hooks
  2. pre-revprop-changeまたは pre-revprop-change.batスクリプトはありますか?その場合は、変更しようとすると中止される部分を一時的にコメント化しますsvn:log
  3. それ以外の場合、Windowsでは、という空のファイルを作成しますpre-revprop-change.bat。これを行う1つの方法を次に示します。

    copy con pre-revprop-change.bat
    ^Z
    
  4. それ以外の場合は、Unixで実行します

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. 作業コピーで、svn propedit -r N --revprop svn:logもう一度実行します

  6. ~/svnrepo/hooks/svn-revprop-change.bat)への変更を元に戻します

0

サーバー側のpre-rev-prop-changeフックの素晴らしい実装をsvnforumで見つけました:https ://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change -shell-script-allows-commiters-to-change-own-log-within-x-hours

実装する

  • ユーザーチェック、つまり自分のコミットメッセージのみ編集できます。
  • SVN管理者オーバーライド。管理者は何でも編集できます。
  • タイムスタンプの比較:特定の時間より新しいコミットのみ編集できます

そこからそれをつかんで自由に編集してください。私は原作者ではないので、ここにコピーしないでください。コピーを許可する著作権表示はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.