如何编辑已在Subversion中提交的日志消息?

时间:2008-11-20 05:13:19

标签: svn commit

有没有办法在Subversion中编辑某个修订版的日志消息?我在提交消息中意外地写了错误的文件名,这可能会让人感到困惑。

我见过 How do I edit an incorrect commit message in Git? ,但这个问题的解决方案似乎与Subversion不相似(根据svn help commit)。

10 个答案:

答案 0 :(得分:446)

基本上,您必须拥有(直接或间接)管理员权限才能执行此操作。您可以配置存储库以允许所有用户执行此操作,也可以直接在服务器上修改日志消息。

请参阅this partSubversion FAQ(强调我的):

  

日志消息保存在   存储库作为附加到的属性   每次修订。 默认情况下,日志   消息属性(svn:log)不能   一旦提交就编辑。那是   因为修改属性的更改   (其中svn:log是一个)导致   属性的先前值   永久丢弃,和Subversion   试图阻止你这样做   偶然。但是,有一个   有两种方法可以获得Subversion   更改修订属性。

     

第一种方式是存储库   管理员启用修订   财产修改。这个完成了   通过创建一个名为的钩子   “pre-revprop-change”(见本节)   在Subversion书中了解更多   有关如何执行此操作的详细信息)。该   “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。

     

更改日志的第二种方法   消息是使用svnadmin setlog。   这必须参考   存储库的位置   文件系统。您无法修改遥控器   使用此命令的存储库。

$ svnadmin setlog REPOS_PATH -r N FILE
     

其中REPOS_PATH是存储库   location,N是修订号   您要更改的日志消息,   和FILE是一个包含新文件的文件   日志消息。如果   “pre-revprop-change”钩子不在   地方(或者你想绕过钩子   脚本由于某种原因),你也可以   使用--bypass-hooks选项。   但是,如果您决定使用此功能   选项,要非常小心。你可能   绕过诸如电子邮件之类的东西   更改或备份的通知   跟踪修订的系统   属性。

答案 1 :(得分:86)

运行此命令时,

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

Source

Windows托管的SVN

hooks目录中的模板文件不能使用,因为它们是特定于Unix的。您需要将Windows批处理文件pre-revprop-change.bat复制到hooks目录,例如提供的here

答案 2 :(得分:45)

这是一个方便的变化,我在常见问题中没有提到。您可以通过指定文本编辑器返回当前消息以进行编辑。

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

答案 3 :(得分:36)

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

答案 4 :(得分:17)

我最近也接受了这项任务。

我们希望允许我们的程序员只修改他们自己的提交消息,并限制他们允许这样做多久。我们决定允许他们修改当天提交的任何日志消息,以修复拼写错误等。

在网上看了几个其他的例子我一起攻击了这个,我们在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 

编辑:最初的想法来自this thread

答案 5 :(得分:14)

在Windows上,使用Tortoise SVN客户端:

  1. 右键单击项目文件夹,然后选择“显示日志”
  2. 在“日志消息”窗口中,右键单击修订并选择“编辑日志消息”
  3. 如果它不起作用,可能是因为服务器上的SVN设置方式,请在此处阅读其他响应。

答案 6 :(得分: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'

您可以根据需要修改邮件。

答案 7 :(得分:8)

如果您的存储库允许通过pre-revprop-change挂钩设置修订版属性,则可以更轻松地更改日志消息。

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

或者在TortoiseSVN,AnkhSVN以及可能的许多其他subversion客户端中,右键单击日志条目然后“更改日志消息”。

答案 8 :(得分:2)

Subversion FAQ涵盖了这一点,但使用了一堆令人困惑的未定义术语,例如REPOS_PATH,但未提供任何实际示例。

可能需要几次尝试才能使其工作,因此请将更新的提交消息保存在文件中。与svn-commit.tmp文件不同,如果出现问题,Subversion将不会保留您的输入。

在您的工作目录中,运行

svn propedit -r N --revprop svn:log

编辑提交消息。如果那样有效,太好了!但它可能不会,因为svn:log版本属性是无版本的,默认情况下Subversion会阻止您覆盖它,使用hook script pre-revprop-change,或者出现错误消息没有这样的钩子。

要更改挂钩,您需要访问托管存储库的文件系统。 svn info将告诉您存储库根目录。假设它是~/svnrepo

  1. cd~/svnrepo/hooks
  2. 是否有pre-revprop-changepre-revprop-change.bat脚本?如果是这样,暂时注释掉 如果您尝试更改svn:log,则会中止部分内容。
  3. 否则,开启 Windows,创建一个名为pre-revprop-change.bat的空白文件。这是一种方法:

    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

答案 9 :(得分:0)

我在svnforum上发现了服务器端pre-rev-prop-change钩子的一个不错的实现: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管理员覆盖;管理员可以编辑任何内容。
  • 时间戳比较:只能编辑小于特定时间的提交

从那里抓取它,然后随意编辑。我不想在这里复制它,因为我不是原始作者,并且没有版权声明允许我这样做。