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

¿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, lo 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 ).

Básicamente, debe tener derechos de administrador (directa o indirectamente) en el repository para hacerlo. Puede configurar el repository 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 repository 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 haya confirmado . 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 maneras de hacer que Subversion cambie una propiedad de revisión.

La primera es que el administrador del repository habilite las modificaciones de la 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 gancho “pre-revprop-change” tiene acceso al mensaje de registro anterior antes de que se modifique, por lo que puede conservarlo de alguna manera (por ejemplo, enviando un correo electrónico). Una vez que las modificaciones de propiedad de revisión están habilitadas, 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 repository. Si ejecuta este comando desde una copia de trabajo, puede dejar fuera de la URL.

La segunda forma de cambiar un mensaje de registro es usar svnadmin setlog. Esto debe hacerse consultando la ubicación del repository en el sistema de archivos. No puede modificar un repository remoto usando este comando.

 $ svnadmin setlog REPOS_PATH -r N FILE 

donde REPOS_PATH es la ubicación del repository, 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 gancho “pre-revprop-change” no está en su lugar (o si desea omitir el script hook por alguna razón), también puede usar la opción –bypass-hooks. Sin embargo, si decides usar esta opción, ten mucho cuidado. Puede omitir cosas tales como las notificaciones por correo electrónico del cambio o los sistemas de respaldo que realizan un seguimiento de las propiedades de revisión.

Cuando ejecuta 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 enlace pre-revprop-change del repository haya fallado o no exista

Es porque Subversion no te permite modificar los mensajes de registro porque no están versionados y se perderán de forma permanente.

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

 cd ~/svn/reponame/hooks 

Eliminar la extensión

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

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

 chmod 755 pre-revprop-change 

Fuente

Aquí hay una variación útil que no veo mencionada en las preguntas frecuentes. Puede devolver el mensaje actual para su edición 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 han encargado esto también.

Queríamos permitir que nuestros progtwigdores modifiquen solo sus propios mensajes de compromiso y restrinjan qué tan atrás pueden hacerlo. Decidimos que se les permitiría modificar cualquier mensaje de registro cometido ese día, para corregir errores tipográficos, etc.

Después de mirar un par de otros ejemplos en línea, lo pirateé, 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 :

Si está usando un IDE como eclipse, puede usar esta manera 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' .

Puede modificar el mensaje como desee desde aquí.

En Windows, usando el cliente Tortoise SVN:

  1. haga clic derecho en su carpeta de proyecto y elija “Mostrar registro”
  2. en la ventana de 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 SVN está configurado en el servidor, lea aquí otras respuestas.

Si su repository permite configurar las propiedades de revisión a través del gancho de cambio de preprogtwigción, 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 muchos otros clientes de subversión haciendo clic derecho en una entrada de registro y luego “cambiar el mensaje de registro”.

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

Podría tomar algunos bashs 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 tu directorio de trabajo, ejecuta

svn propedit -r N --revprop svn:log

para editar el mensaje de compromiso. Si eso funciona, ¡genial! Pero probablemente no lo hará, porque la propiedad de revisión svn:log no está versionada y Subversion por defecto evitará que se sobrescriba, ya sea con la secuencia de comandos hook pre-revprop-change , o un mensaje de error de que no tiene dicha gancho.

Para cambiar los ganchos, necesita acceso al sistema de archivos en el que está alojado el repository. svn info te dirá la raíz del repository. 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 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 manera de hacerlo:

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

     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 los cambios en ~/svnrepo/hooks/svn-revprop-change ( .bat )
    Intereting Posts