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