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

有没有办法在Subversion中编辑某个版本的日志消息? 我不小心写了错误的文件名在我的提交信息,这可能会在以后的混淆。

我见过如何在Git中编辑不正确的提交消息? ,但是这个问题的解决scheme似乎并不相似(根据svn help commit )。

基本上你必须有直接或间接的pipe理权限才能做到这一点。 您可以configuration存储库以允许所有用户执行此操作,也可以直接在服务器上修改日志消息。

看到这个 Subversion常见问题的 一部分 (重点是我的):

日志消息作为附加到每个修订版本的属性保存在存储库中。 默认情况下,日志消息属性(svn:log)一旦被提交就不能被编辑 。 这是因为对版本属性(svn:log是其中一个)的修改会导致属性先前的值被永久抛弃,而Subversion会试图阻止您意外地执行此操作。 但是,有几种方法可以让Subversion更改修订版本属性。

第一种方法是让版本库pipe理员启用修订版本属性修改。 这是通过创build一个名为“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是存储库位置,N是您希望更改日志消息的修订版本号,FILE是包含新日志消息的文件。 如果“pre-revprop-change”钩子没有到位(或者由于某种原因你想跳过钩子脚本),你也可以使用–bypass-hooks选项。 但是,如果您决定使用此选项,请非常小心。 您可能会绕过此类更改的电子邮件通知,或者跟踪修订属性的备份系统。

当你运行这个命令时,

 svn propedit svn:log --revprop -r NNN 

以防万一你看到这个消息:

DAV请求失败; 存储库的pre-revprop-change钩子可能失败或不存在

这是因为Subversion不允许你修改日志消息,因为它们是未版本化的,并且会永久丢失。

转到Subversion服务器上的hooks目录(用你的版本库的目录replace〜/ svn / reponame)

 cd ~/svn/reponame/hooks 

删除扩展名

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

使其可执行(不能做chmod + x!)

 chmod 755 pre-revprop-change 

资源

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

 svn propedit svn:log --revprop -r N --editor-cmd vim 
 svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt 

我最近也负责这个任务。

我们希望允许我们的程序员只修改他们自己的提交信息,并限制他们被允许这么做的程度。 我们决定允许他们修改当天提交的任何日志消息,修正错字等。

在网上pre-revprop-change.bat了一些其他的例子之后,我把它们一起砍了,我们在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'

您可以从这里修改消息。

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

  1. 右键单击您的项目文件夹,然后select“显示日志”
  2. 在“日志消息”窗口中,右键单击某个版本,然后select“编辑日志消息”

如果它不起作用,可能是因为服务器上的SVN的设置,请阅读其他答案。

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

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

或者在TortoiseSVN,AnkhSVN和其他许多颠覆客户端中,右键单击日志条目然后“更改日志消息”。

Subversion常见问题涵盖了这一点,但是却使用了一些令人困惑的未定义术语(如REPOS_PATH而没有给出任何实例。

它可能需要一些尝试才能使其工作,所以保存更新的提交信息在一个文件中。 与svn-commit.tmp文件不同,如果出现问题,Subversion不会保留您的input。

在你的工作目录中运行

svn propedit -r N --revprop svn:log

编辑提交消息。 如果这样的话,太棒了! 但是它可能不会,因为svn:log revision属性是未版本化的,并且默认情况下Subversion会阻止你覆盖它,或者使用钩子脚本 pre-revprop-change或者没有这样的错误信息钩。

要更改挂钩,您需要访问存储库所在的文件系统。 svn info会告诉你Repository Root。 假设它是~/svnrepo

  1. cd~/svnrepo/hooks
  2. 是否有pre-revprop-changepre-revprop-change.bat脚本? 如果是这样的话,如果你试图改变svn:log ,暂时注释掉它的部分。
  3. 否则,在Windows上,创build一个名为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再次svn propedit -r N --revprop svn:log

  6. 撤销对~/svnrepo/hooks/svn-revprop-change.bat~/svnrepo/hooks/svn-revprop-change