How to edit log message already committed in Subversion?

前端 未结 10 1528
太阳男子
太阳男子 2020-11-27 23:54

Is there a way to edit the log message of a certain revision in Subversion? I accidentally wrote the wrong filename in my commit message which could be confusing later.

相关标签:
10条回答
  • 2020-11-28 00:31
    svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
    
    0 讨论(0)
  • 2020-11-28 00:31

    If your repository enables setting revision properties via the pre-revprop-change hook you can change log messages much easier.

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

    Or in TortoiseSVN, AnkhSVN and probably many other subversion clients by right clicking on a log entry and then 'change log message'.

    0 讨论(0)
  • 2020-11-28 00:33

    I was recently tasked with this as well.

    We wanted to allow our programmers to modify only their own commit messages, and restrict how far back they are allowed to do so. We decided they would be allowed to modify any log messages committed that day, to fix typo's etc.

    After looking at a couple other examples online I hacked this together, we are in a windows environment, so this is our contents of 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 
    

    Edit: Original idea for this came from this thread:

    0 讨论(0)
  • 2020-11-28 00:33

    The Subversion FAQ covers this, but uses a bunch of confusing undefined terms like REPOS_PATH without giving any actual examples.

    It might take a few tries to get it to work, so save your updated commit message in a file. Unlike with svn-commit.tmp files, Subversion won’t preserve your typing if there’s a problem.

    In your working directory, run

    svn propedit -r N --revprop svn:log

    to edit the commit message. If that works, great! But it probably won’t, because the svn:log revision property is unversioned and Subversion by default will stop you from overwriting it, either with the hook script pre-revprop-change, or an error message that you don’t have such a hook.

    To change the hooks, you need access to the filesystem on which the repository is hosted. svn info will tell you the Repository Root. Suppose it’s ~/svnrepo.

    1. cd to ~/svnrepo/hooks
    2. Is there a pre-revprop-change or pre-revprop-change.bat script? If so, temporarily comment out the part of it that aborts if you try to change svn:log.
    3. Otherwise, on Windows, create a blank file called pre-revprop-change.bat. Here’s one way to do that:

      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)
    0 讨论(0)
  • 2020-11-28 00:34

    If you are using an IDE like eclipse, you can use this easy way.

    Right click on the project -> Team - Show history
    

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

    You can modify the message as you want from here.

    0 讨论(0)
  • 2020-11-28 00:34

    I found a nice implementation of the server side pre-rev-prop-change hook at the svnforum: 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

    It implements

    • user checking, that is only own commit messages can be edited.
    • Svn admin override; admin can edit anything.
    • time stamp comparison: only commits that are younger than certain time can be edited

    Grab it from there and edit at will. I'd rather not copy it here since I am not the original author and there is no copyright notice that would allow me to do it.

    0 讨论(0)
提交回复
热议问题