有没有办法在Subversion中编辑某个修订版的日志消息?我在提交消息中意外地写了错误的文件名,这可能会让人感到困惑。
我见过 How do I edit an incorrect commit message in Git? ,但这个问题的解决方案似乎与Subversion不相似(根据svn help commit
)。
答案 0 :(得分:446)
基本上,您必须拥有(直接或间接)管理员权限才能执行此操作。您可以配置存储库以允许所有用户执行此操作,也可以直接在服务器上修改日志消息。
请参阅this part的Subversion FAQ(强调我的):
日志消息保存在 存储库作为附加到的属性 每次修订。 默认情况下,日志 消息属性(svn:log)不能 一旦提交就编辑。那是 因为修改属性的更改 (其中svn:log是一个)导致 属性的先前值 永久丢弃,和Subversion 试图阻止你这样做 偶然。但是,有一个 有两种方法可以获得Subversion 更改修订属性。
第一种方式是存储库 管理员启用修订 财产修改。这个完成了 通过创建一个名为的钩子 “pre-revprop-change”(见本节) 在Subversion书中了解更多 有关如何执行此操作的详细信息)。该 “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
其中N. 是其日志的修订号 您想要更改的消息,URL是 存储库的位置。如果你 从一个工作中运行此命令 复制,你可以不用URL。
更改日志的第二种方法 消息是使用svnadmin setlog。 这必须参考 存储库的位置 文件系统。您无法修改遥控器 使用此命令的存储库。
$ svnadmin setlog REPOS_PATH -r N FILE
其中REPOS_PATH是存储库 location,N是修订号 您要更改的日志消息, 和FILE是一个包含新文件的文件 日志消息。如果 “pre-revprop-change”钩子不在 地方(或者你想绕过钩子 脚本由于某种原因),你也可以 使用--bypass-hooks选项。 但是,如果您决定使用此功能 选项,要非常小心。你可能 绕过诸如电子邮件之类的东西 更改或备份的通知 跟踪修订的系统 属性。
答案 1 :(得分:86)
运行此命令时,
svn propedit svn:log --revprop -r NNN
以防万一你看到这条消息:
DAV请求失败;它有可能 存储库的pre-revprop-change 挂钩失败或不存在
这是因为Subversion不允许您修改日志消息,因为它们是未版本化的并且将永久丢失。
转到Subversion服务器上的hooks目录(将〜/ svn / reponame替换为存储库的目录)
cd ~/svn/reponame/hooks
删除扩展程序
mv pre-revprop-change.tmpl pre-revprop-change
让它可执行(不能做chmod + x!)
chmod 755 pre-revprop-change
hooks目录中的模板文件不能使用,因为它们是特定于Unix的。您需要将Windows批处理文件pre-revprop-change.bat
复制到hooks目录,例如提供的here。
答案 2 :(得分:45)
这是一个方便的变化,我在常见问题中没有提到。您可以通过指定文本编辑器返回当前消息以进行编辑。
svn propedit svn:log --revprop -r N --editor-cmd vim
答案 3 :(得分:36)
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
答案 4 :(得分:17)
我最近也接受了这项任务。
我们希望允许我们的程序员只修改他们自己的提交消息,并限制他们允许这样做多久。我们决定允许他们修改当天提交的任何日志消息,以修复拼写错误等。
在网上看了几个其他的例子我一起攻击了这个,我们在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:
答案 5 :(得分:14)
在Windows上,使用Tortoise SVN客户端:
如果它不起作用,可能是因为服务器上的SVN设置方式,请在此处阅读其他响应。
答案 6 :(得分: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'
。
您可以根据需要修改邮件。
答案 7 :(得分:8)
如果您的存储库允许通过pre-revprop-change挂钩设置修订版属性,则可以更轻松地更改日志消息。
svn propedit --revprop -r 1234 svn:log url://to/repository
或者在TortoiseSVN,AnkhSVN以及可能的许多其他subversion客户端中,右键单击日志条目然后“更改日志消息”。
答案 8 :(得分:2)
Subversion FAQ涵盖了这一点,但使用了一堆令人困惑的未定义术语,例如REPOS_PATH
,但未提供任何实际示例。
可能需要几次尝试才能使其工作,因此请将更新的提交消息保存在文件中。与svn-commit.tmp
文件不同,如果出现问题,Subversion将不会保留您的输入。
在您的工作目录中,运行
svn propedit -r N --revprop svn:log
编辑提交消息。如果那样有效,太好了!但它可能不会,因为svn:log
版本属性是无版本的,默认情况下Subversion会阻止您覆盖它,使用hook script pre-revprop-change
,或者出现错误消息没有这样的钩子。
要更改挂钩,您需要访问托管存储库的文件系统。 svn info
将告诉您存储库根目录。假设它是~/svnrepo
。
cd
至~/svnrepo/hooks
pre-revprop-change
或
pre-revprop-change.bat
脚本?如果是这样,暂时注释掉
如果您尝试更改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
)答案 9 :(得分:0)
我在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
它实现
从那里抓取它,然后随意编辑。我不想在这里复制它,因为我不是原始作者,并且没有版权声明允许我这样做。