首页 文章

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

提问于
浏览
526

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

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

9 回答

  • 436

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

    svn propedit svn:log --revprop -r N --editor-cmd vim
    
  • 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' .

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

  • 2

    Subversion FAQ涵盖了这一点,但使用了一堆令人困惑的未定义术语,如 REPOS_PATH 而没有给出任何实际的例子 .

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

    在您的工作目录中,运行

    svn propedit -r N --revprop svn:log

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

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

    • cd~/svnrepo/hooks

    • 是否有 pre-revprop-changepre-revprop-change.bat 脚本?如果是这样,如果您尝试更改 svn:log ,请暂时注释掉中止的部分 .

    • 否则,在Windows上,创建一个名为 pre-revprop-change.bat 的空白文件 . 这是一种方法:

    copy con pre-revprop-change.bat
    ^Z
    
    • 否则,在Unix上运行
    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
    • 在工作副本中,再次运行 svn propedit -r N --revprop svn:log

    • 撤消对 ~/svnrepo/hooks/svn-revprop-change 的更改( .bat

  • 79

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

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

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

  • 7

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

    • 右键单击项目文件夹并选择"Show log"
      在日志消息窗口中
    • ,右键单击修订并选择"Edit log message"

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

  • 12

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

    参见Subversion FAQthis part(强调我的):

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

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

    运行此命令时

    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
    

    Source

  • 36

    我最近也负责这项任务 .

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

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

相关问题