Comment éditer un message de log déjà engagé dans Subversion?

y a-t-il un moyen d'éditer le message de journalisation d'une certaine révision dans Subversion? J'ai accidentellement écrit le mauvais nom de fichier dans mon message de propagation qui pourrait être confus plus tard.

j'ai vu comment modifier un message de propagation incorrect dans Git? , mais la solution à cette question ne semble pas similaire pour Subversion (selon svn help commit ).

519
demandé sur Community 2008-11-20 08:13:19

9 réponses

essentiellement, vous devez avoir des droits admin (directement ou indirectement) sur le dépôt pour le faire. Vous pouvez soit configurer le dépôt pour permettre à tous les utilisateurs de le faire, soit modifier le message log directement sur le serveur.

Voir la présente partie de la Subversion FAQ (l'emphase est mienne):

Les messages de Log

sont référentiel propriétés attachées à chacun révision. par défaut, le log la propriété de message (svn: log) ne peut pas être édité une fois qu'il est engagé . C'est parce que les modifications aux propriétés de révision (dont svn: log est un) cause de la propriété valeur précédente d'être définitivement jeté, et Subversion essaie de vous empêcher de faire ce accidentellement. Cependant, il y a un deux façons d'amener Subversion à modifier une propriété de révision.

la première voie est pour le référentiel administrateur pour activer la révision modification des propriétés. C'est fait en créant un crochet appelé "pré-revprop-change" (voir cette section) dans le livre Subversion pour en savoir plus les détails sur la façon de le faire). Le le crochet "pre-revprop-change" a accès à l'ancien message de log avant qu'il ne soit changé, de sorte qu'il peut le conserver dans certains (par exemple, par l'envoi d'un courriel.) Une fois la propriété de révision les modifications sont activées, vous pouvez modifier le message de journalisation d'une révision par en passant le --revprop passer à svn propedit ou svn propset, soit l'un d'eux:

$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 changer, 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 emplacement sur le système de fichiers. Vous ne pouvez pas modifier une distance dépôt utilisant cette commande.

$ svnadmin setlog REPOS_PATH -r N FILE

où REPOS_PATH est le dépôt emplacement N est le numéro de révision dont vous souhaitez modifier le message de log, et fichier est un fichier contenant le nouveau message de journal. Si l' le crochet "pre-revprop-change" n'est pas dans endroit ou vous souhaitez contourner le crochet script pour une raison quelconque), vous pouvez également utilisez l'option -- bypass-hooks. Toutefois, si vous décidez d'utiliser cette option, fais très attention. Vous avez peut-être contourner des choses comme le courrier électronique notification de la modification, ou sauvegarde systèmes de suivi des révisions propriété.

429
répondu Kamil Kisiel 2011-02-24 11:32:38

quand vous exécutez cette commande,

svn propedit svn:log --revprop -r NNN 

et juste au cas où vous voyez ce message:

demande DAV échoué; il est possible que pré-revprop-change du référentiel crochet a échoué ou est inexistante", 151950920"

C'est parce que Subversion ne vous permet pas de modifier les messages log parce qu'ils ne sont pas suivis en versions et qu'ils seront perdus en permanence.

Aller aux crochets de la répertoire sur votre serveur Subversion (remplacer ~ / svn / reponame par 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

79
répondu Alex. S. 2009-06-21 05:57:24

voici une variante pratique que je ne vois pas mentionnée dans la faq. Vous pouvez retourner le message en cours d'édition en spécifiant un éditeur de texte.

svn propedit svn:log --revprop -r N --editor-cmd vim
43
répondu mcqwerty 2012-09-14 00:21:58
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
35
répondu nickf 2008-11-20 05:17:58

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

nous voulions permettre à nos programmeurs de ne modifier que leurs propres messages de propagation, et de limiter le temps qu'ils ont pour le faire. Nous avons décidé qu'ils seraient autorisés à modifier tous les messages de journal commis ce jour-là, pour corriger les fautes de frappe, etc.

après avoir regardé quelques autres exemples en ligne j'ai hacké ceci ensemble, nous sommes dans un environnement windows, donc c'est 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: l'idée originale pour cela est venue de ce fil :

16
répondu Josh Weatherly 2013-08-01 21:55:51

Si vous utilisez un IDE comme eclipse, vous pouvez utiliser ce moyen facile.

Right click on the project -> Team - Show history

dans ce right click on the revision id for your commit and select 'Set commit properties' .

vous pouvez modifier le message comme vous le souhaitez à partir d'ici.

12
répondu mani_nz 2013-12-26 11:25:53

sur Windows, en utilisant Tortoise SVN client:

  1. faites un clic droit dans votre dossier de projet et choisissez "Afficher le journal"
  2. dans la fenêtre des messages de journal, faites un clic droit sur une révision et choisissez "Modifier le message de journal "

si cela ne fonctionne pas, cela pourrait être dû à la façon dont SVN sur le serveur est configuré, lisez les autres réponses ici.

12
répondu Andrei N. 2016-09-06 15:37:03

si votre dépôt permet de définir les propriétés de révision via le crochet pre-revprop-change, vous pouvez modifier les messages de journalisation beaucoup plus facilement.

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

ou dans TortoiseSVN, AnkhSVN et probablement beaucoup d'autres clients subversion en cliquant avec le bouton droit de la souris sur une entrée log puis 'change log message'.

7
répondu Bert Huijben 2008-11-20 10:32:26

la FAQ Subversion couvre cela, mais utilise un tas de termes confus et non définis comme REPOS_PATH sans donner d'exemples réels.

cela peut prendre quelques essais pour le faire fonctionner, alors enregistrez votre message de propagation mis à jour dans un fichier. Contrairement aux fichiers svn-commit.tmp , Subversion ne préservera pas votre saisie en cas de problème.

dans votre répertoire de travail, Lancez

svn propedit -r N --revprop svn:log

pour éditer le message de propagation. Si cela fonctionne, c'est parfait! Mais ce ne sera probablement pas le cas, parce que la propriété de révision svn:log n'est pas suivie en versions et Subversion par défaut vous empêchera de l'écraser, soit avec le hook script pre-revprop-change , soit avec un message d'erreur que vous n'avez pas un tel hook.

Pour changer les crochets, vous avez besoin d'accéder au système de fichiers sur lequel le dépôt est hébergé. svn info vous dira le Racine Du Dépôt. Supposons que c'est ~/svnrepo .

  1. cd à ~/svnrepo/hooks
  2. y a-t-il un pre-revprop-change ou pre-revprop-change.bat ? Si donc, provisoirement commentaire de l' une partie de ce qui avorte si vous essayez de changer svn:log .
  3. Windows, Créer un fichier vierge appelé pre-revprop-change.bat . Voici une façon de le faire:

    copy con pre-revprop-change.bat
    ^Z
    
  4. Sinon, sur Unix, Lancez

    echo '#!/bin/sh' > pre-revprop-change
    chmod +x pre-revprop-change
    
  5. dans la copie de travail, Lancez svn propedit -r N --revprop svn:log à nouveau

  6. annulez vos modifications ~/svnrepo/hooks/svn-revprop-change ( .bat )
2
répondu andrewdotn 2012-08-07 14:43:02