¿Cómo editar el mensaje de registro ya confirmado en Subversion?
Pregunta
¿Hay alguna forma 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 (de acuerdo con svn help commit
).
Solución
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 Preguntas frecuentes sobre Subversion (el énfasis es mío):
Los mensajes de registro se guardan en repositorio como propiedades adjuntas a cada revisión Por defecto, el registro la propiedad del mensaje (svn: log) no puede ser editado una vez que se confirma . Es decir porque los cambios en las propiedades de revisión (de los cuales svn: log es uno) porque valor anterior de la propiedad para ser descartado permanentemente, y Subversion intenta evitar que hagas esto accidentalmente. Sin embargo, hay un Un par de formas de obtener Subversion para cambiar una propiedad de revisión.
La primera forma es para el repositorio administrador para habilitar la revisión modificaciones de propiedad. Esto esta hecho creando un gancho llamado " pre-revprop-change " (ver esta sección en el libro de Subversion para más detalles sobre cómo hacer esto). los " pre-revprop-change " gancho tiene acceso al mensaje de registro anterior antes de que sea cambiado, por lo que puede preservarlo en algunos manera (por ejemplo, enviando un correo electrónico). Una vez que la propiedad de revisión las modificaciones están habilitadas, puedes cambiar el mensaje de registro de una revisión por 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 registro mensaje que desea cambiar y la URL es La ubicación del repositorio. Si tu ejecutar este comando desde dentro de un trabajo copiar, puede dejar fuera de la URL.
La segunda forma de cambiar un registro mensaje es usar svnadmin setlog. Esto debe hacerse haciendo referencia a la ubicación del repositorio en el sistema de archivos No puedes modificar un control remoto repositorio utilizando este comando.
$ svnadmin setlog REPOS_PATH -r N FILE
donde REPOS_PATH es el repositorio ubicación, 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 " pre-revprop-change " gancho no está en lugar (o si quieres evitar el gancho guión por alguna razón), también puedes use la opción --bypass-hooks. Sin embargo, si decides usar esto opción, ten mucho cuidado. Usted puede ser omitiendo cosas como el correo electrónico notificaciones del cambio o copia de seguridad sistemas que realizan un seguimiento de la revisión propiedades.
Otros consejos
Cuando ejecuta este comando,
svn propedit svn:log --revprop -r NNN
y por si acaso ves este mensaje:
Error en la solicitud DAV; es posible que el cambio previo a la revisión del repositorio el gancho falló o no existe
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
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.bat
en el directorio de ganchos, p. el proporcionado aquí .
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
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
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 :
En Windows, utilizando el cliente Tortoise SVN:
- haga clic derecho en la carpeta de su proyecto y elija " Mostrar registro "
- en la ventana Mensajes de registro, haga clic con el botón 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í.
Si está utilizando un IDE como eclipse, puede usar esta manera fácil.
Right click on the project -> Team - Show history
En ese haga clic derecho en el id de revisión para su confirmación y seleccione 'Establecer propiedades de confirmación'
.
Puede modificar el mensaje como desee desde aquí.
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'.
Las Preguntas frecuentes de Subversion cubre esto, pero utiliza un montón de confusión términos indefinidos como REPOS_PATH
sin 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 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 ganará, porque la propiedad de revisión svn: log
no está versionada y Subversion, por defecto, evitará que la sobrescriba, ya sea con el script de gancho pre-revprop-change
, o un mensaje de error que indica que no tiene ese enlace.
Para cambiar los ganchos, 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
.
-
cd
a~/svnrepo/hooks
- ¿Hay un
pre-revprop-change
opre-revprop-change.bat
script? Si es así, comenta temporalmente el parte de eso que se cancela si intenta cambiarsvn: log
. -
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
-
De lo contrario, en Unix, ejecute
echo '#!/bin/sh' > pre-revprop-change chmod +x pre-revprop-change
-
En la copia de trabajo, ejecute
svn propedit -r N --revprop svn: log
nuevamente - Deshaga sus cambios a
~ / svnrepo / hooks / svn-revprop-change
(.bat
)