代码之家  ›  专栏  ›  技术社区  ›  Paige Ruten

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

  •  594
  • Paige Ruten  · 技术社区  · 17 年前

    在Subversion中,是否有方法编辑某个修订的日志消息?我不小心在提交消息中写入了错误的文件名,这可能会在以后造成混淆。

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

    11 回复  |  直到 9 年前
        1
  •  471
  •   TheJuice    15 年前

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

    看见 this part 的 Subversion FAQ (强调我的):

    日志消息保存在 存储库作为附加到的属性 每次修订。 默认情况下,日志 消息属性(svn:log)不能 提交后进行编辑 这就是 因为修订属性的更改 (svn:log就是其中之一)导致 房产的先前价值为 永久丢弃和Subversion 试图阻止你这样做 意外地。然而,有一个 有几种方法可以让Subversion 更改修订属性。

    第一种方式是存储库 管理员启用修订 属性修改。这就完成了 通过创建一个名为 “预转桨更换”(见本节 在Subversion一书中了解更多 关于如何做到这一点的详细信息)。这个 “预转螺旋桨更换”挂钩可以进入 在旧日志消息之前 更改,以便在某些情况下保留它 方式(例如,通过发送 电子邮件)。一次修订属性 如果启用了修改,您可以 通过以下方式更改修订的日志消息 将--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是一个包含新 日志消息。如果 “预转螺旋桨更换”挂钩不在 位置(或者你想绕过钩子 出于某种原因编写脚本),您也可以 使用--bypass钩子选项。 但是,如果您决定使用此 选择,要非常小心。你可能是 绕过电子邮件等东西 更改通知或备份 跟踪修订的系统 物业。

        2
  •  92
  •   Robert xMRi    7 年前

    当您运行此命令时,

    svn propedit svn:log --revprop -r NNN 
    

    万一你看到这条消息:

    DAV请求失败;有可能 存储库在revprop之前的更改 钩子失败或不存在

    这是因为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

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

        3
  •  50
  •   alex    14 年前

    这里有一个方便的变体,我在faq中没有看到提到。您可以通过指定文本编辑器返回当前消息进行编辑。

    svn propedit svn:log --revprop -r N --editor-cmd vim
    
        4
  •  39
  •   nickf    17 年前
    svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
    
        5
  •  19
  •   WriteEatSleepRepeat    10 年前

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

    1. 在项目文件夹中右键单击并选择“显示日志”
    2. 在“日志消息”窗口中,右键单击修订并选择“编辑日志消息”

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

        6
  •  18
  •   Josh Weatherly    13 年前

    我最近也接到了这个任务。

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

    在网上看了其他几个例子后,我把它拼凑在一起,我们在一个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 :

        7
  •  14
  •   mani_nz    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' .

    您可以从这里根据需要修改消息。

        8
  •  11
  •   Ankur Agarwal    7 年前

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

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

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

        9
  •  3
  •   andrewdotn    14 年前

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

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

    在您的工作目录中,运行

    svn propedit -r N --revprop svn:log

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

    要更改挂钩,您需要访问存储库所在的文件系统。 svn info 将告诉您存储库根。假设它 ~/svnrepo .

    1. cd 向 ~/svnrepo/hooks
    2. 有没有 预转螺旋桨更换 或 pre-revprop-change.bat 脚本?如果是这样,请暂时评论 如果你试图改变,它的一部分就会中止 svn:log .
    3. 否则,在 Windows,创建一个名为的空白文件 修订前更改.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 )
        10
  •  1
  •   teroi    6 年前

    我在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管理覆盖;管理员可以编辑任何内容。
    • 时间戳比较:只有比特定时间短的提交才能编辑

    从那里抓取并随意编辑。我宁愿不在这里复制,因为我不是原作者,也没有版权声明允许我这样做。