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

550

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

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 (según svn help commit).

Jeremy Ruten
fuente
26
Iba a upvote esta pregunta, pero luego me di cuenta de que ya lo hice hace 4 meses :)
oksayt
66
Si es código, solo haga algunos comentarios y comprométase nuevamente con los comentarios apropiados. Si está de acuerdo con que sus comentarios reflejen el error, es mucho menos esfuerzo y mucho más rápido. Si no, la solución de Kamil Kisiel es claramente la forma correcta de hacerlo.
Marty
Existe un excelente pre-revprop-changescript que permite al usuario que se compromete a modificar su registro hasta 3 horas después de la confirmación. Este es un excelente compromiso entre la flexibilidad / registros precisos y el mantenimiento de la fidelidad del repositorio: wandisco.com/svnforum/threads/…
jwa
si no puede cambiar el archivo pero aún desea agregar un nuevo mensaje de confirmación , puede hacerlosvn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
mulllhausen el

Respuestas:

457

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

Consulte esta parte de las Preguntas frecuentes sobre 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 un par de formas de hacer que Subversion cambie una propiedad de revisión.

La primera forma es que el administrador del repositorio habilite las modificaciones de propiedad de revisión. Esto se hace creando un gancho llamado "pre-revprop-change" (vea esta sección en el libro de Subversion para más detalles sobre cómo hacer esto). El enlace "pre-revprop-change" tiene acceso al antiguo mensaje de registro antes de que se cambie, por lo que puede preservarlo de alguna manera (por ejemplo, enviando un correo electrónico). Una vez que se habilitan las modificaciones de propiedades de revisión, puede cambiar el mensaje de registro de una revisión pasando el modificador --revprop a svn propedit o svn propset, como cualquiera 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 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 haciendo referencia a la ubicación del repositorio en el sistema de archivos. No puede modificar un repositorio remoto con 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 FILE es un archivo que contiene el nuevo mensaje de registro. Si el enlace "pre-revprop-change" no está en su lugar (o si desea omitir el script de enlace por algún motivo), también puede usar la opción --bypass-hooks. Sin embargo, si decide utilizar esta opción, tenga mucho cuidado. Puede omitir cosas como notificaciones por correo electrónico del cambio o sistemas de respaldo que realizan un seguimiento de las propiedades de revisión.

Kamil Kisiel
fuente
15
A partir del 3 de febrero de 2010, la URL es subversion.apache.org/faq.html#change-log-msg
GreenMatt
1
Aquí hay una implementación básica para la opción svnadmin svn-change-commit
albfan
2
¡Gracias! Sigue siendo útil 6,5 años después de la respuesta. :-)
Michael
El método propedit más o menos trabajado; sin embargo, no pude hacer que el cambio de registro se refleje en el navegador de repositorios. Solo pude ver el registro actualizado en la línea de comando svn en Windows. Tuve que actualizar el caché de registro como paso final: stackoverflow.com/questions/25750249/…
user_007
89

Cuando ejecutas este comando,

svn propedit svn:log --revprop -r NNN 

y por si acaso ves este mensaje:

Solicitud de DAV fallida; es posible que el gancho previo al cambio de revprop del repositorio haya fallado o no exista

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

SVN alojado en Unix

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

cd ~/svn/reponame/hooks

Eliminar la extensión

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

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

chmod 755 pre-revprop-change

Fuente

SVN alojado en Windows

Los archivos de plantilla en el directorio de ganchos no se pueden usar ya que son específicos de Unix. Debe copiar un archivo por lotes de Windows pre-revprop-change.baten el directorio de ganchos, por ejemplo, el que se proporciona aquí .

Alex S.
fuente
1
¿Por qué escribiste entre paréntesis " no se puede hacer chmod + x!"
Apóstol
1
He creado un pequeño script que implementa la misma idea aquí blog.mmonem.com/enable-changing-svn-log
mmonem
SVN_EDITOR, VISUAL o EDITOR deben configurarse antes de usar svn propedit
Gerd
48

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
mcqwerty
fuente
17
Requiere que se haya creado el gancho, lo que requiere derechos de administrador. svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
Matt
Aquí hay un script para habilitar el registro: blog.mmonem.com/enable-changing-svn-log
mmonem
37
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
nickf
fuente
Estoy usando Google Code, así que no creo que pueda hacerlo de esta manera, pero gracias.
Jeremy Ruten el
44
esto funcionó para mí ya que el método propedit falló con "El repositorio no se ha habilitado para aceptar cambios de revisión". ¡Gracias!
pfctdayelise
1
+1 por dar el comando directamente :-) apache.org estaba caído en este momento y no podía seguir ningún enlace dado ...
Rafa
¡Esta respuesta merece más puntos! Es mejor porque no tiene que configurar el gancho para usarlo.
Peri Hartman
1
para esta respuesta, funcionó para mí sin configurar el gancho, tampoco cambió la "fecha / hora" de revisión en el registro, solo el mensaje, que era exactamente lo que esperaba.
segFaultCoder
17

Recientemente me encargaron esto también.

Queríamos permitir que nuestros programadores modificaran solo sus propios mensajes de confirmación y restringir cuánto tiempo atrás se les permite hacerlo. Decidimos que se les permitiría modificar cualquier mensaje de registro comprometido ese día, corregir errores tipográficos, etc.

Después de mirar un par de otros ejemplos en línea, pirateé esto juntos, estamos en un entorno de Windows, así 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 

Editar: La idea original para esto vino de este hilo :

Josh Weatherly
fuente
77
Por alguna razón, en mi sistema (que ejecuta Server 2012 y VisualSVN), en la última verificación de fecha if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD, tuve que cambiar a comillas dobles alrededor de las dos variables. (No creería cuánto tiempo tardó en averiguarlo). De lo contrario, obtendría cosas como "== '02' es inesperado en este momento" (el segundo día del mes). Mi lote no es lo suficientemente fuerte como para saber por qué sucede eso, pero en caso de que alguien más tenga problemas extraños, puede ayudar.
Carl Bussema
@CarlBussema: Gracias por ese dato. Me acabas de salvar un gran dolor de cabeza.
Daniel Szabo el
1
También tenga en cuenta que la secuencia de comandos anterior utiliza el formato de fecha estadounidense, "Espera la fecha en el formato: jue 08/01/2013" . Entonces, si no usa eso, necesita modificar esa parte, en mi caso el formato era "mm.dd.yy", y sin el día de la semana.
Zitrax
Esa es una variación genial de esta buena respuesta: stackoverflow.com/questions/6155/…
NateJ
17

En Windows, utilizando el cliente Tortoise SVN:

  1. haga clic derecho en la carpeta de su proyecto y elija "Mostrar registro"
  2. en la ventana Mensajes de registro, haga clic derecho en una revisión y elija "Editar mensaje de registro"

Si no funciona, podría deberse a la forma en que se configura SVN en el servidor, lea otras respuestas aquí.

Andrei N.
fuente
Gracias, esta fue una solución más fácil para mí, +1. Es esencial tener permisos.
theGabyRod
12

Si está utilizando un IDE como eclipse, puede utilizar esta manera fácil.

Right click on the project -> Team - Show history

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

Puede modificar el mensaje como desee desde aquí.

mani_nz
fuente
Al menos en TortoiseSVN, al intentar editar las propiedades de confirmación para una confirmación en el registro de confirmación falla con el mismo mensaje de error que al intentar editar directamente el mensaje de registro.
Christian Severin
1
"Error en la solicitud DAV; es posible que el enlace de cambio previo a la revisión del repositorio haya fallado o no exista. El depósito no se ha habilitado para aceptar cambios de revisión; solicite al administrador que cree un enlace de cambio previo a la revisión". Pero como dije: eso está usando TortoiseSVN (como no administrador), no Eclipse. Tal vez Eclipse piratea los permisos SVN para crear ese gancho, no lo sé.
Christian Severin
Si tal vez. Intenta hacerlo en eclipse.
mani_nz
@ChristianSeverin, recibo el mismo mensaje de error cuando uso Eclipse. Seguramente proviene del servidor Subversion.
GreenhouseVeg
10

Si su repositorio permite configurar 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 svn:log url://to/repository

O en TortoiseSVN, AnkhSVN y probablemente muchos otros clientes de subversión haciendo clic derecho en una entrada de registro y luego 'cambiar mensaje de registro'.

Bert Huijben
fuente
2
en Subclipse (Eclipse) es "Establecer propiedades de confirmación".
pfctdayelise
2

Las Preguntas Frecuentes de Subversion cubren esto, pero usa un montón de términos confusos e indefinidos, como REPOS_PATHsin dar ningún ejemplo real.

Puede tomar algunos intentos para que funcione, así que guarde su mensaje de confirmación actualizado en un archivo. A diferencia de los svn-commit.tmparchivos, 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á, porque la svn:logpropiedad de revisión no está versionada y Subversion de forma predeterminada evitará que la sobrescriba, ya sea con el script de enlace pre-revprop-change o con un mensaje de error que indica que no tiene dicho enlace.

Para cambiar los ganchos, necesita acceso al sistema de archivos en el que está alojado el repositorio. svn infole 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.batscript? Si es así, comente temporalmente la parte que se cancela 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 hacer eso:

    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, svn propedit -r N --revprop svn:logvuelva a ejecutar

  6. Deshacer sus cambios a ~/svnrepo/hooks/svn-revprop-change( .bat)
andrewdotn
fuente
0

Encontré una buena implementación del gancho del servidor pre-rev-prop-change en el svnforum: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change -shell-script-permite-commiters-to-change-own-log-within-x-hours

Implementa

  • verificación del usuario, es decir, solo se pueden editar los propios mensajes de confirmación.
  • Svn anulación de administrador; El administrador puede editar cualquier cosa.
  • comparación de marca de tiempo: solo se pueden editar los commits que son más jóvenes que cierto tiempo

Agarrar desde allí y editar a voluntad. Prefiero no copiarlo aquí, ya que no soy el autor original y no hay ningún aviso de derechos de autor que me permita hacerlo.

teroi
fuente