当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何编辑已在Subversion中提交的日志消息?》经验,为你挑选了8个好方法。

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

我已经看过如何在Git中编辑不正确的提交消息?但是对于那个问题的解决方案似乎与Subversion不相似(根据svn help commit).



1> Kamil Kisiel..:

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

请参见本部分中的颠覆常见问题解答(重点煤矿):

日志消息作为附加到每个修订的属性保存在存储库中.默认情况下,日志消息属性(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选项.但是,如果您决定使用此选项,请务必小心.您可能会绕过诸如更改的电子邮件通知或跟踪修订属性的备份系统之类的事情.


截至2010年2月3日,URL为http://subversion.apache.org/faq.html#change-log-msg
谢谢!答案6.5年后仍然有用。:-)

2> Alex. S...:

运行此命令时

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目录,例如此处提供的目录.



3> mcqwerty..:

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

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


它确实需要创建钩子 - 这需要管理员权限.`svn:尚未启用存储库来接受修订版本的更改; 请管理员创建一个pre-revprop-change hook`

4> nickf..:
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt


这对我有用,因为propedit方法失败了"存储库尚未启用接受修订版本的更改".谢谢!

5> Josh Weather..:

我最近也负责这项任务.

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

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

编辑:这个想法来自这个线程:


出于某种原因,在我的系统(运行Server 2012和VisualSVN)上,在最后一个日期检查`if/I not'%DATESTAMPDAY%'=='%DAY%'转到ERROR_MSGTOOOLD`,我不得不切换到双引号两个变量.(你不会相信需要多长时间才能搞清楚.)否则我会得到"=='02'这个时候出乎意料的事情"(在这个月的第二天).我的批次fu不够强大,不知道为什么会发生这种情况,但如果其他人遇到奇怪的问题,它可能会有所帮助.

6> Andrei N...:

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

    右键单击项目文件夹并选择"显示日志"

    在"日志消息"窗口中,右键单击修订并选择"编辑日志消息"

如果它不起作用,可能是因为服务器上的SVN设置方式,请在此处阅读其他响应.



7> mani_nz..:

如果你使用像eclipse这样的IDE,你可以使用这种简单的方法.

Right click on the project -> Team - Show history

在那right click on the revision id for your commit and select 'Set commit properties'.

您可以从此处根据需要修改消息.



8> Bert Huijben..:

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

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

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


在Subclipse(Eclipse)中,它是"Set Commit Properties".
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有