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

Svn 如何编辑Subversion中已提交的日志消息?,svn,commit,Svn,Commit,有没有办法在Subversion中编辑某个版本的日志消息?我不小心在我的提交消息中写入了错误的文件名,这可能会导致以后的混乱 我已经看到了,但是对于Subversion(根据svn help commit)来说,这个问题的解决方案似乎并不相似。基本上,要做到这一点,您必须拥有存储库的管理员权限(直接或间接)。您可以将存储库配置为允许所有用户执行此操作,也可以直接在服务器上修改日志消息 见(矿山重点): 日志消息保存在 存储库作为附加到的属性 每次修订默认情况下,日志 无法删除消息属性(svn:l

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


我已经看到了,但是对于Subversion(根据
svn help commit
)来说,这个问题的解决方案似乎并不相似。

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

见(矿山重点):

日志消息保存在 存储库作为附加到的属性 每次修订默认情况下,日志 无法删除消息属性(svn:log) 提交后即进行编辑。就是 因为对修订属性的更改 (其中svn:log是一个)导致 属性的上一个值是 永久丢弃和颠覆 试图阻止你这样做 意外地然而,有一个问题 使用Subversion的两种方法 更改修订属性

第一种方法是存储库 管理员启用修订 财产修改。这已经完成了 通过创建一个名为 “pre revprop change”(参见本节 在《颠覆》一书中了解更多信息 有关如何执行此操作的详细信息)。这个 “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 
在哪里 是其日志的修订号 您希望更改的消息,URL为 存储库的位置。如果你 在工作区内运行此命令 复制,您可以删除URL

更改日志的第二种方法 消息是使用svnadmin setlog。 这必须通过参考 存储库在 文件系统。您不能修改远程文件 使用此命令存储库。

$ svnadmin setlog REPOS_PATH -r N FILE
其中REPOS_PATH是存储库 位置,N是修订号 您希望更改其日志消息, 文件是一个包含新 日志消息。如果 “pre revprop change”挂钩不在 放置(或您希望绕过挂钩) 脚本),您还可以 使用--bypass钩子选项。 但是,如果您决定使用此 选择,要非常小心。你可能是 绕过电子邮件之类的东西 更改或备份的通知 跟踪修订的系统 财产


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

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

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

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

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

运行此命令时

svn propedit svn:log --revprop -r NNN 
万一你看到这个信息:


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

这是因为Subversion不允许您修改日志消息,因为它们是未版本的,将永久丢失

Unix托管的SVN 转到Subversion服务器上的hooks目录(将~/svn/reponame替换为存储库的目录)

拆下延长件

mv pre-revprop-change.tmpl pre-revprop-change
使其可执行(不能执行chmod+x!)

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

涵盖了这一点,但使用了一系列混乱的未定义术语,如
REPOS\u PATH
,但没有给出任何实际示例

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

在工作目录中,运行

svn propedit-rn--revprop svn:log

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

要更改挂钩,您需要访问存储库所在的文件系统<代码>svn信息将告诉您存储库根目录。假设它是
~/svnrepo

  • cd
    to
    ~/svnrepo/hooks
  • 是否有
    预转载道具更改
    pre-revprop change.bat
    script?如果是,请暂时注释掉 如果您尝试更改
    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
    )的更改

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

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

    在网上看了几个其他的例子后,我把它们拼凑在一起,我们在windows环境中,所以这是我们的
    pre revprop change.bat
    :<
    chmod 755 pre-revprop-change
    
    copy con pre-revprop-change.bat
    ^Z
    
    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
    @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 
    
    Right click on the project -> Team - Show history