有没有办法在Subversion中编辑某个修订版的日志消息?我不小心在我的提交消息中写了错误的文件名,这可能会让人感到困惑.
我已经看过如何在Git中编辑不正确的提交消息?但是对于那个问题的解决方案似乎与Subversion不相似(根据svn help commit
).
基本上,您必须具有管理员权限(直接或间接)到存储库才能执行此操作.您可以配置存储库以允许所有用户执行此操作,也可以直接在服务器上修改日志消息.
请参见本部分中的颠覆常见问题解答(重点煤矿):
日志消息作为附加到每个修订的属性保存在存储库中.默认情况下,日志消息属性(svn:log)一旦提交就无法编辑.这是因为修改属性(其中svn:log为1)的更改会导致属性的先前值被永久丢弃,而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是存储库位置,N是要更改其日志消息的修订号,FILE是包含新日志消息的文件.如果没有"pre-revprop-change"挂钩(或者由于某种原因你想绕过钩子脚本),你也可以使用--bypass-hooks选项.但是,如果您决定使用此选项,请务必小心.您可能会绕过诸如更改的电子邮件通知或跟踪修订属性的备份系统之类的事情.
运行此命令时
svn propedit svn:log --revprop -r NNN
以防万一你看到这条消息:
DAV请求失败; 存储库的pre-revprop-change挂钩可能会失败或者不存在
这是因为Subversion不允许您修改日志消息,因为它们是未版本化的并且将永久丢失.
转到Subversion服务器上的hooks目录(将〜/ svn/reponame替换为存储库的目录)
cd ~/svn/reponame/hooks
删除扩展名
mv pre-revprop-change.tmpl pre-revprop-change
让它可执行(不能做chmod + x!)
chmod 755 pre-revprop-change
资源
hooks目录中的模板文件不能使用,因为它们是特定于Unix的.您需要将Windows批处理文件复制pre-revprop-change.bat
到hooks目录,例如此处提供的目录.
这是一个方便的变化,我在常见问题中没有提到.您可以通过指定文本编辑器返回当前消息以进行编辑.
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
在那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客户端中,通过右键单击日志条目然后"更改日志消息".