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

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

我看过如何在Git中编辑错误的提交消息?< / >,但是这个问题的解决方案似乎与Subversion不一样(根据svn help commit)。

310917 次浏览

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

参见Subversion常见问题解答这部分(重点是我的):

日志信息保存在 作为附加属性的存储库 每个修订。缺省情况下,日志 消息属性(svn:log)不能为 。这是 因为修改了修订属性 (svn:log是其中之一) 属性的先前值为 永久丢弃和颠覆 试图阻止你这么做 不小心。然而,有一个 两种方法来获得Subversion

第一种方法是存储库 管理员启用修订 属性修改。这就完成了 通过创建一个名为 “pre-revprop-change”(参见本节) 有关更多信息,请参阅Subversion书籍 如何做到这一点的详细信息)。的 "pre-revprop-change"钩子有访问权限 到旧日志消息之前 改变了,所以它可以保留一些 方式(例如,通过发送一个 电子邮件)。一次修订性质 修改已启用,您可以 更改修订的日志消息 向SVN下发——revprop开关 Propedit或SVN propset 其中之一:

$svn propedit -r N --revprop svn:log URL
$svn propset -r N --revprop svn:log "new log message" URL
< p > N 修订号是谁的日志 您希望更改的消息,URL为 存储库的位置。如果你 在一个正在工作的

. copy,你可以去掉URL

修改日志的第二种方法 消息是使用svnadmin setlog。 必须通过引用 存储库的位置 文件系统。远程设备不支持修改

. Repository使用此命令
$ svnadmin setlog REPOS_PATH -r N FILE

,其中REPOS_PATH是存储库 location, N为修订号 您希望更改谁的日志信息, 和FILE是包含new的文件 日志消息。如果 “pre-revprop-change”钩子不在 放置(或者绕过钩子) 脚本),你也可以 使用——bypass-hooks选项。 但是,如果你决定使用这个 选择,要非常小心。你可能是 绕过像电子邮件这样的事情 更改通知或备份通知 跟踪修订的系统 属性。< / p >

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

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

Source .

Windows-hosted SVN

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

Subversion常见问题解答涵盖了这一点,但使用了一堆令人困惑的未定义术语,如REPOS_PATH,而没有给出任何实际示例。

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

在工作目录中运行

# EYZ0

编辑提交消息。如果有效,那太好了!但它可能不会,因为svn:log修订属性是未版本化的,默认情况下Subversion将阻止您覆盖它,要么使用钩子脚本 pre-revprop-change,要么使用错误消息告诉您没有这样的钩子。

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

  1. cd~/svnrepo/hooks
  2. 是否有pre-revprop-change或 # EYZ0脚本?如果是,则暂时注释掉 如果你试图改变svn:log.
  3. <李> < p >否则, 在Windows中,创建一个名为pre-revprop-change.bat的空白文件。这里有一种方法:

    copy con pre-revprop-change.bat
    ^Z
    
  4. Otherwise, on Unix, run

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. In the working copy, run svn propedit -r N --revprop svn:log again

  6. Undo your changes to ~/svnrepo/hooks/svn-revprop-change(.bat)

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

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

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

编辑:最初的想法来自这个线程:

如果您正在使用eclipse之类的IDE,则可以使用这种简单的方法。

Right click on the project -> Team - Show history

right click on the revision id for your commit and select 'Set commit properties'

您可以从这里修改您想要的消息。

在Windows操作系统下,使用Tortoise SVN客户端:

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

如果它不起作用,可能是由于SVN在服务器上的设置方式,请在这里阅读其他响应。

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

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

我的版本的pre-revprop-change批处理脚本与地区无关的时间比较。我在这里使用了一个PowerShell调用,它在某些情况下似乎会闪烁一个窗口,并增加了明显的延迟。

@ECHO OFF


set reposPath=%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% %reposPath%') 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 minDate=
set revDate=
set revDateStr=
for /f "delims=" %%a in ('svnlook date -r %rev% %reposPath%') do set revDateStr=%%a


:: Expects revDateStr in the format: 2012-02-24 ...
:: https://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.date.html
for /F "tokens=1-3 delims=- " %%a in ("%revDateStr%") do set revDate=%%a%%b%%c
:: Note that PowerShell calls like this can be slow and a window can show up while they run.
for /f %%i in ('"powershell (Get-Date).AddDays(-1).ToString(\"yyyyMMdd\")"') do set minDate=%%i
if "%revDate%" LSS "%minDate%" 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 that are too old (2+ days). >&2
goto ERROR_EXIT


:ERROR_EXIT
exit /b 1
< p >来源: # EYZ0, # EYZ1, # EYZ0 < / p >