581 votes

Comment puis-je modifier un message de journal que j’ai déjà commis, dans Subversion ?

Y a-t-il un moyen d’éditer le message du journal d’une certaine révision dans Subversion ? J’ai écrit accidentellement le mauvais nom de fichier dans mon message de validation qui pourrait être source de confusion plus tard.

J’ai vu Comment éditer un message de validation incorrect dans Git ?, mais la solution à cette question ne semble pas être semblable pour la Subversion (selon `` ).

476voto

Kamil Kisiel Points 7298

Essentiellement, vous devez avoir les droits admin (directement ou indirectement) dans le référentiel pour ce faire. Vous pouvez configurer le référentiel pour permettre à tous les utilisateurs de ce faire, ou vous pouvez modifier le message du journal directement sur le serveur.

Voir cette partie de la Subversion FAQ (l'emphase est mienne):

Journal des messages sont conservés dans la référentiel propriétés attachées à chaque révision. Par défaut, le journal message propriété svn:log) ne peut pas être édité une fois qu'il est engagé. C'est parce que les changements de propriétés de révision (dont svn:log est une) cause l' propriété valeur précédente d'être définitivement mis au rebut, et de la Subversion essaie de vous empêcher de faire ce accidentellement. Cependant, il y a un couple de façons d'obtenir de la Subversion changer une révision de la propriété.

La première est pour le référentiel l'administrateur pour permettre à la révision modification des propriétés. C'est fait par la création d'un crochet appelé "pre-revprop-change" (voir cette section dans le livre de Subversion pour plus d' les détails sur la façon de le faire). L' "pre-revprop-change" crochet a accès pour l'ancien journal de message avant de l' changé, de sorte qu'il peut le conserver dans certains (par exemple, par l'envoi d'un e-mail). Une fois la révision de la propriété les modifications sont activées, vous pouvez changer une révision du message de journal par en passant l'option --revprop passer à svn propedit ou svn propset, soit l'un de ces:

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

où N est le numéro de révision dont le journal message que vous souhaitez modifier, et l'URL est l'emplacement du référentiel. Si vous exécuter cette commande à partir à l'intérieur d'un travail la copie, vous pouvez laisser de côté l'URL.

La deuxième façon de changer un journal le message est d'utiliser svnadmin setlog. Cela doit être fait en se référant à la référentiel de l'emplacement sur le système de fichiers. Vous ne pouvez pas modifier une distance référentiel à l'aide de cette commande.

$ svnadmin setlog REPOS_PATH -r N FILE

où REPOS_PATH est le référentiel emplacement N est le numéro de révision dont le message de journal que vous souhaitez modifier, et le FICHIER est un fichier contenant la nouvelle message de journal. Si l' "pre-revprop-change" du crochet n'est pas dans endroit ou vous souhaitez contourner le crochet script pour une raison quelconque), vous pouvez également utilisez l'option --contourner les crochets en option. Toutefois, si vous décidez d'utiliser cette option, être très prudent. Vous avez peut-être en contournant l'e-mail notifications de changement ou de sauvegarde les systèmes qui assurent le suivi de la révision les propriétés.

95voto

Alex. S. Points 16684

Lorsque vous exécutez cette commande,

svn propedit svn:log --revprop -r NNN

et juste au cas où vous voyez ce message:

DAV échec de la demande; il est possible que le référentiel du pre-revprop-change crochet a échoué ou est inexistante

Son parce que la Subversion ne vous permettra pas de modifier les messages du journal parce qu'ils sont sans version et seront définitivement perdues.

Aller aux crochets de répertoire sur votre serveur Subversion (remplacer ~/svn/reponame avec le répertoire de votre dépôt)

cd ~/svn/reponame/hooks

Supprimer l'extension

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

Le rendre exécutable ne peut pas faire chmod +x!)

chmod 755 pre-revprop-change

Source

50voto

mcqwerty Points 2106

Voici une variation très pratique que je ne vois pas mentionné dans la faq. Vous pouvez renvoyer le message en cours pour l’édition en spécifiant un éditeur de texte.

41voto

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

19voto

Josh Weatherly Points 1065

J'ai récemment été chargé de ce.

Nous avons voulu permettre à nos programmeurs pour modifier leurs propres messages de validation, et de limiter combien de temps ils sont autorisés à le faire. Nous avons décidé qu'ils seraient autorisés à modifier les messages du journal commis ce jour-là, à la correction de faute de frappe, etc....

Après avoir regardé quelques autres exemples en ligne j'ai piraté le cette ensemble, nous sommes dans un environnement windows, c'est donc notre contenu 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: une idée Originale pour cela venait de ce fil:

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X