Can I go back and edit comments on an SVN checkin?

I put a mistake into a comment in SVN. Can I edit this after checkin?


Solution 1:

Commit messages are "unversioned properties" and can be changed with the svn propset command, for example

$ svn propset --revprop -r 25 svn:log "Journaled about trip to New York."
property 'svn:log' set on repository revision '25'

This is setting the revision property called "svn:log" on revision 25

Configuring subversion to allow revision property changes

Because these are unversioned, a default installation of subversion won't let you modify these properties unless you provide a pre-revprop-change hook script.

Here's a typical script, from /var/lib/svn/hooks/pre-revprop-change on my system:

#!/bin/sh

REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ]; then 
  echo "$1 $2 $3 $4 $5" >> /var/lib/svn/logchanges.log
  exit 0; 
fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1

This logs changes to svn:log revision properties, and allows the edit by using exit 0, any other revision property change is denied by using exit 1. See patmortech's answer for a Windows equivalent.

Solution 2:

To enable the revision property modification, you need to create a pre-revprop-change hook script. Can read about it here: http://svnbook.red-bean.com/en/1.0/ch05s02.html (look for Hook Scripts section).

For Windows, here's a link to an example batch file that only allows changes to the log message (not other properties): http://ayria.livejournal.com/33438.html. Basically copy the code below into a text file and name it pre-revprop-change.bat and save it in the /hooks subdirectory for your repository.

@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5

:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" goto ERROR_PROPNAME

:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION

:: Make sure that the new svn:log message is not empty.
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 messages are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log messages are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1

Solution 3:

A way to do a quick change to the log message without having to create a pre-revprop-change hook script is to use the following svnadmin command:

svnadmin setlog --bypass-hooks REPOS_PATH -r N FILE

where REPOS_PATH is the path to the repository on the server (e.g. /srv/svn/repository) and N is the revision number (e.g. 25) and FILE is a text file containing the correct commit log entry.

Two things: This requires filesystem access to the repository files, but so does creating a pre-revprop-change hook script... and secondly, this command will bypass any hook scripts that may be in place, so use advisedly...