svn tortoise ¿Cómo editar el mensaje de registro ya confirmado en Subversion?




tortoise svn server (8)

¿Hay alguna manera de editar el mensaje de registro de una cierta revisión en Subversion? Accidentalmente escribí el nombre de archivo incorrecto en mi mensaje de confirmación, que podría ser confuso más adelante.

He visto ¿Cómo edito un mensaje de confirmación incorrecto en Git? , pero la solución a esa pregunta no parece ser similar para Subversion (de acuerdo con svn help commit ).


Cuando ejecutas este comando,

svn propedit svn:log --revprop -r NNN 

y en caso de que veas este mensaje:

La solicitud DAV falló; es posible que el enganche anterior al cambio de cambio de repositorio haya fallado o no exista

Es porque Subversion no le permite modificar los mensajes de registro porque no se han revisado y se perderán permanentemente.

Vaya al directorio de enlaces en su servidor de Subversion (reemplace ~ / svn / reponame con el directorio de su repositorio)

cd ~/svn/reponame/hooks

Quitar la extensión

mv pre-revprop-change.tmpl pre-revprop-change

Hazlo ejecutable (no se puede hacer chmod + x!)

chmod 755 pre-revprop-change

Source


Esencialmente, debe tener derechos de administrador (directa o indirectamente) en el repositorio para hacer esto. Puede configurar el repositorio para permitir que todos los usuarios lo hagan, o puede modificar el mensaje de registro directamente en el servidor.

Vea esta parte de las preguntas frecuentes de Subversion (énfasis mío):

Los mensajes de registro se guardan en el repositorio como propiedades adjuntas a cada revisión. De forma predeterminada, la propiedad del mensaje de registro (svn: log) no se puede editar una vez que se confirma . Esto se debe a que los cambios en las propiedades de revisión (de los cuales svn: log es uno) hacen que el valor anterior de la propiedad se descarte permanentemente, y Subversion intenta evitar que lo haga accidentalmente. Sin embargo, hay algunas formas de hacer que Subversion cambie una propiedad de revisión.

La primera forma es que el administrador del repositorio habilite las modificaciones de las propiedades de revisión. Esto se hace creando un enlace llamado "pre-revprop-change" (consulte esta sección en el libro de Subversion para obtener más detalles sobre cómo hacer esto). El enlace "pre-revprop-change" tiene acceso al mensaje de registro anterior antes de que se cambie, por lo que puede conservarlo de alguna manera (por ejemplo, enviando un correo electrónico). Una vez que se habilitan las modificaciones de la propiedad de revisión, puede cambiar el mensaje de registro de una revisión pasando el interruptor --revprop a svn propedit o svn propset, como uno de estos:

$svn propedit -r N --revprop svn:log URL 
$svn propset -r N --revprop svn:log "new log message" URL 

donde N es el número de revisión cuyo mensaje de registro desea cambiar y la URL es la ubicación del repositorio. Si ejecuta este comando desde una copia de trabajo, puede omitir la URL.

La segunda forma de cambiar un mensaje de registro es usar svnadmin setlog. Esto debe hacerse refiriéndose a la ubicación del repositorio en el sistema de archivos. No puedes modificar un repositorio remoto usando este comando.

$ svnadmin setlog REPOS_PATH -r N FILE

donde REPOS_PATH es la ubicación del repositorio, N es el número de revisión cuyo mensaje de registro desea cambiar y ARCHIVO es un archivo que contiene el nuevo mensaje de registro. Si el enlace "pre-revprop-change" no está en su lugar (o si quiere omitir el script de enlace por alguna razón), también puede usar la opción --bypass-hooks. Sin embargo, si decide utilizar esta opción, tenga mucho cuidado. Puede pasar por alto cosas como las notificaciones por correo electrónico del cambio o los sistemas de respaldo que realizan un seguimiento de las propiedades de revisión.


Las Preguntas frecuentes de Subversion cubren esto, pero utilizan un montón de términos indefinidos confusos como REPOS_PATH sin dar ningún ejemplo real.

Puede tomar varios intentos para que funcione, así que guarde su mensaje de confirmación actualizado en un archivo. A diferencia svn-commit.tmp archivos svn-commit.tmp , Subversion no conservará su escritura si hay un problema.

En su directorio de trabajo, ejecute

svn propedit -r N --revprop svn:log

para editar el mensaje de confirmación. Si eso funciona, ¡genial! Pero probablemente no lo hará, ya que la propiedad svn:log revision no se revierte y Subversion de forma predeterminada evitará que se sobrescriba, ya sea con el script de enganche pre-revprop-change o un mensaje de error que pre-revprop-change que no tiene gancho.

Para cambiar los enlaces, necesita acceso al sistema de archivos en el que está alojado el repositorio. svn info le dirá la raíz del repositorio. Supongamos que es ~/svnrepo .

  1. cd a ~/svnrepo/hooks
  2. ¿Hay un pre-revprop-change o pre-revprop-change.bat ? Si es así, comente temporalmente la parte que se aborta si intenta cambiar svn:log .
  3. De lo contrario, en Windows, cree un archivo en blanco llamado pre-revprop-change.bat . Aquí hay una forma de hacerlo:

    copy con pre-revprop-change.bat
    ^Z
    
  4. De lo contrario, en Unix, ejecute

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. En la copia de trabajo, ejecute svn propedit -r N --revprop svn:log again

  6. Deshaga sus cambios en ~/svnrepo/hooks/svn-revprop-change ( .bat )

Si está utilizando un IDE como eclipse, puede usar esta forma fácil.

Right click on the project -> Team - Show history

En ese right click on the revision id for your commit and select 'Set commit properties' .

Puedes modificar el mensaje como quieras desde aquí.


Si su repositorio habilita la configuración de las propiedades de revisión a través del enlace pre-revprop-change, puede cambiar los mensajes de registro mucho más fácilmente.

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

O en TortoiseSVN, AnkhSVN y probablemente en muchos otros clientes de Subversion, haga clic con el botón derecho en una entrada de registro y luego "cambie el mensaje de registro".


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

Recientemente me encargaron de esto también.

Queríamos permitir que nuestros programadores modifiquen solo sus propios mensajes de confirmación, y restringir el tiempo que tienen permitido hacerlo. Decidimos que se les permitiría modificar cualquier mensaje de registro confirmado ese día, para corregir errores tipográficos, etc.

Después de ver un par de ejemplos en línea que piratearon esto juntos, estamos en un entorno de Windows, por lo que este es nuestro contenido de 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: La idea original para esto vino de este hilo :


Aquí hay una variación útil que no veo mencionada en las preguntas frecuentes. Puede devolver el mensaje actual para editarlo especificando un editor de texto.

svn propedit svn:log --revprop -r N --editor-cmd vim






commit