是否有一种方法可以在Subversion中编辑某个修订的日志消息?我不小心在我的提交消息中写了错误的文件名,这可能会让人困惑。

我已经看到如何在Git中编辑错误的提交消息?,但这个问题的解决方案似乎与Subversion不同(根据svn help commit)。


当前回答

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

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

其他回答

如果您的存储库允许通过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

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

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

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

编辑:最初的想法来自这个帖子:

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

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

执行此命令时,

svn propedit svn:log --revprop -r NNN 

以防你看到这条信息

DAV请求失败;有可能 存储库的pre-revprop-change 钩子要么失败,要么不存在

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

Unix-hosted 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-hosted SVN

hooks目录中的模板文件不能使用,因为它们是特定于unix的。您需要复制一个Windows批处理文件pre-revprop-change.bat到hooks目录,例如这里提供的目录。