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

有没有一种方法可以在Subversion中编辑某个修订的日志消息? 我不小心在提交消息中输入了错误的文件名,这以后可能会造成混淆。

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


#1楼

当您运行此命令时,

svn propedit svn:log --revprop -r NNN 

以防万一您看到此消息:

DAV请求失败; 存储库的pre-revprop-change挂钩有可能失败或不存在

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

Unix托管的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托管的SVN

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

扫描二维码关注公众号,回复: 8547055 查看本文章

#2楼

Subversion FAQ涵盖了这一点,但是使用了很多令人困惑的未定义术语,例如REPOS_PATH而没有给出任何实际示例。

要使其正常工作可能需要一些尝试,因此请将更新的提交消息保存在文件中。 与svn-commit.tmp文件不同,如果出现问题,Subversion不会保留您的键入内容。

在您的工作目录中,运行

svn propedit -r N --revprop svn:log

编辑提交消息。 如果可行,那就太好了! 但这可能不会,因为svn:log修订版属性是未版本化的,并且默认情况下Subversion会阻止您使用钩子脚本 pre-revprop-change覆盖它,或者显示一条错误消息,指出您没有这样的内容钩。

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

  1. cd~/svnrepo/hooks
  2. 是否存在pre-revprop-changepre-revprop-change.bat脚本? 如果是这样,请暂时注释掉尝试更改svn:log中止部分。
  3. 否则,在Windows上,创建一个名为pre-revprop-change.bat的空白文件。 这是一种方法:

     copy con pre-revprop-change.bat ^Z 
  4. 否则,在Unix上运行

     echo '#!/bin/sh' > pre-revprop-change chmod +x pre-revprop-change 
  5. 在工作副本中,再次运行svn propedit -r N --revprop svn:log

  6. 撤消对~/svnrepo/hooks/svn-revprop-change.bat~/svnrepo/hooks/svn-revprop-change

#3楼

最近,我也受了这个任务。

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

在网上看了几个其他示例之后,我一起破解了这些代码,我们在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 

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


#4楼

如果使用的是类似eclipse的IDE,则可以使用这种简单的方法。

Right click on the project -> Team - Show history

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

您可以从此处根据需要修改消息。


#5楼

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

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

日志消息作为附加到每个修订版的属性保留在资源库中。 默认情况下,提交日志消息属性(svn:log)后就无法对其进行编辑 。 这是因为对修订版属性(其中svn:log为1)的更改导致该属性的先前值被永久丢弃,并且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是存储库位置,N是要更改其日志消息的修订号,而FILE是包含新日志消息的文件。 如果“ pre-revprop-change”钩子不存在(或者由于某些原因要跳过钩子脚本),则也可以使用--bypass-hooks选项。 但是,如果决定使用此选项,请非常小心。 您可能会绕过诸如更改通知的电子邮件通知或跟踪修订属性的备份系统之类的内容。


#6楼

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

#7楼

如果您的存储库允许通过pre-revprop-change挂钩设置修订版本属性,则可以更轻松地更改日志消息。

svn propedit --revprop -r 1234 svn:log url://to/repository

或在TortoiseSVN,AnkhSVN以及可能还有许多其他Subversion客户端中,右键单击日志条目,然后“更改日志消息”。


#8楼

在Windows上,使用Tortoise SVN客户端:

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

如果不起作用,则可能是由于服务器上SVN的设置方式所致,请在此处阅读其他响应。


#9楼

我在svnforum上找到了服务器端pre-rev-prop-change钩子的不错实现: https ://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change 壳脚本允许提交者在x小时内更改自己的日志

它实现

  • 用户检查,即只能编辑自己的提交消息。
  • SVN管理员优先; 管理员可以编辑任何内容。
  • 时间戳比较:只能编辑小于特定时间的提交

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


#10楼

  1. 转到SVN存储库目录,进入子文件夹“ hooks”,例如“ D:\\ SVN \\ hooks \\”
  2. 在此处创建一个空文件“ pre-revprop-change.bat”
  3. 在文件中写入“退出0”(不带“”)并保存
  4. 请享用 :)

(此解决方案肯定有缺点,因为没有检查/禁止任何操作。但是对于我来说,这是我唯一使用的本地存储库,它似乎可以工作。)


#11楼

这是我在常见问题解答中没有提到的一些方便的变化。 您可以通过指定文本编辑器来返回当前消息以进行编辑。

svn propedit svn:log --revprop -r N --editor-cmd vim
发布了0 篇原创文章 · 获赞 1 · 访问量 2551

猜你喜欢

转载自blog.csdn.net/asdfgh0077/article/details/103935922