我能否在SVN提交后返回并编辑评论?

59

我在SVN的评论中留下了一个错误,提交后还能编辑吗?

7个回答

65

提交信息是"未版本化的属性", 可以使用svn propset命令进行更改,例如

$ svn propset --revprop -r 25 svn:log "Journaled about trip to New York."
property 'svn:log' set on repository revision '25'

这是在第25个版本上设置名为"svn:log"的修订属性。

配置subversion允许修改修订属性

由于它们没有版本控制,因此默认安装的subversion不会允许您修改这些属性,除非您提供一个pre-revprop-change钩子脚本。

以下是我系统上/var/lib/svn/hooks/pre-revprop-change中的典型脚本:

#!/bin/sh

REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then 
  echo "$1 $2 $3 $4 $5" >> /var/lib/svn/logchanges.log
  exit 0; 
fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

记录svn:log版本属性的更改,并允许使用exit 0进行编辑,对于任何其他版本属性更改,使用exit 1将被拒绝。有关Windows等效方法,请参见patmortech的回答。

56
为了启用修改版本属性,需要创建一个pre-revprop-change hook脚本。可以在这里了解更多: http://svnbook.red-bean.com/en/1.0/ch05s02.html(查找Hook Scripts部分)。
对于Windows系统,这里提供一个示例批处理文件,它仅允许更改日志消息(而非其他属性):http://ayria.livejournal.com/33438.html。将以下代码复制到文本文件中,并将其命名为pre-revprop-change.bat,保存在存储库的/hooks子目录中即可。
@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5

:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" goto ERROR_PROPNAME

:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION

:: Make sure that the new svn:log message is not empty.
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 messages are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log messages are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1

2
+1 我在回答中忘记了这个,已经发布了 Linux 的等效内容。 - Paul Dixon
2
可以链接到该网站上已经存在的答案,例如https://dev59.com/w3VD5IYBdhLWcg3wWaRh#68850,而不是再次复制/粘贴,这样一个参考就可以随着时间的推移得到改进。 - Philibert Perusse
注意! SVN仓库的路径中不应出现空格字符,否则它将无法正常工作。我为此苦苦挣扎了好几个小时。 - Andy Lin

24

如果不想创建一个 pre-revprop-change 钩子脚本,可以使用下面的 svnadmin 命令 来快速更改日志消息:

svnadmin setlog --bypass-hooks REPOS_PATH -r N FILE

其中REPOS_PATH是服务器上存储库的路径(例如/srv/svn/repository),N是修订版本号(例如25),FILE是包含正确提交日志条目的文本文件。

两点需要注意: 这需要访问存储库文件系统,但创建pre-revprop-change挂钩脚本也需要访问文件系统... 另外,该命令将绕过可能存在的任何挂钩脚本,因此请谨慎使用...


1
他们真是不把事情搞复杂就不罢休... 8-P 这个方法管用。谢谢。显然,我不会经常想要修改评论! - Alexis Wilke
@AlexisWilke 注释历史可能是一件棘手的事情!很高兴我能帮忙! - Kit Roed

9
使用Tortoise SVN将使此过程非常容易。只需打开日志消息窗口,右键单击要编辑的修订日志,并从上下文菜单中选择“编辑日志”。

7
在Tortoise SVN中,您可以按照以下步骤操作:
1. 进入“Repository Browser”。
2. 右键单击要处理的文件夹。
3. 点击“Show Log”。
4. 在修订列表中,选择并右键单击所需的修订版本。
5. 点击“Edit log message”按钮。
现在,您可以在svn checkin修订版本中编辑您的注释。
谢谢!

1
正如其他答案所述,只有在您安装了上述钩子的情况下,此方法才有效。 - JerryOL
我在修订版中添加了一个名为"type"的属性,其值为"bug/feature",以便将几个修订版分组。我尝试了这个方法,并成功地将属性添加到了修订版中,但是如何将该属性作为列显示在修订日志窗口(在Tortoise中)中,就像我们通常在查看存储库日志时看到的修订版、作者、日期、日志列一样?任何帮助都将不胜感激。 - Jack

4
在Eclipse(或Rational Application Developer)中使用Subclipse: 选择Team --> Show History,然后右键单击要更改注释的版本,选择“Set Commit Properties”,您可以更改注释和/或作者。

4
svn propset svn:log --revprop -r <REVISION> "My corrected log message" <PATH-TO-REPOSITORY> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接