web-dev-qa-db-fra.com

Comment éditer un message de journal déjà validé dans Subversion?

Existe-t-il un moyen de modifier le message de journal d'une révision donnée dans Subversion? J'ai accidentellement écrit le mauvais nom de fichier dans mon message de validation, ce qui pourrait prêter à confusion plus tard.

J'ai vu Comment éditer un message de commit incorrect dans Git?, mais la solution à cette question ne fonctionne pas semblent être similaires pour Subversion (selon svn help commit).

539
Jeremy Ruten

Pour ce faire, vous devez disposer de droits d’administrateur (directement ou indirectement) sur le référentiel. Vous pouvez configurer le référentiel pour autoriser tous les utilisateurs à le faire ou modifier le message de journal directement sur le serveur.

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

Les messages de journal sont conservés dans le référentiel en tant que propriétés attachées à chaque révision. Par défaut, la propriété de message de journal (svn: log) ne peut pas être modifiée une fois qu'elle a été validée . En effet, les modifications apportées aux propriétés de révision (dont svn: log en est un) entraînent la suppression définitive de la valeur précédente de la propriété et Subversion tente de vous empêcher de le faire par inadvertance. Cependant, il existe plusieurs façons de faire en sorte que Subversion modifie une propriété de révision.

La première consiste à permettre à l'administrateur du référentiel d'activer les modifications des propriétés de révision. Ceci est fait en créant un hook appelé "pre-revprop-change" (voir cette section dans le livre de Subversion pour plus de détails sur la procédure à suivre). Le point d'ancrage "pre-revprop-change" a accès à l'ancien message de journal avant qu'il ne soit modifié, afin qu'il puisse le conserver d'une manière ou d'une autre (par exemple, en envoyant un courrier électronique). Une fois les modifications des propriétés de révision activées, vous pouvez modifier le message de journal d'une révision en passant le commutateur --revprop à svn propedit ou svn propset, comme ci-dessous:

$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 vous souhaitez modifier le message de journal et URL est l'emplacement du référentiel. Si vous exécutez cette commande depuis une copie de travail, vous pouvez ne pas utiliser l'URL.

La deuxième façon de modifier un message de journal consiste à utiliser svnadmin setlog. Ceci doit être fait en se référant à l'emplacement du référentiel sur le système de fichiers. Vous ne pouvez pas modifier un référentiel distant à l'aide de cette commande.

$ svnadmin setlog REPOS_PATH -r N FILE

où REPOS_PATH est l'emplacement du référentiel, N le numéro de révision dont vous souhaitez modifier le message de journal et FILE, un fichier contenant le nouveau message de journal. Si le hook "pre-revprop-change" n'est pas en place (ou si vous souhaitez contourner le script hook pour une raison quelconque), vous pouvez également utiliser l'option --bypass-hooks. Cependant, si vous décidez d'utiliser cette option, soyez très prudent. Vous pouvez éventuellement ignorer des notifications telles que les notifications par courrier électronique, ou les systèmes de sauvegarde qui gardent une trace des propriétés de la révision.

448
Kamil Kisiel

Lorsque vous exécutez cette commande,

svn propedit svn:log --revprop -r NNN 

et juste au cas où vous voyez ce message:

La demande DAV a échoué. il est possible que le crochet pré-revprop-change du référentiel ait échoué ou soit inexistant

C’est parce que Subversion ne vous autorise pas à modifier les messages de journal, car ils ne sont pas versionnés et seront définitivement perdus.

SVN hébergé par Unix

Allez dans le répertoire hooks de votre serveur Subversion (remplacez ~/svn/reponame par le répertoire de votre référentiel)

cd ~/svn/reponame/hooks

Retirer 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

SVN hébergé sur Windows

Les fichiers modèles du répertoire hooks ne peuvent pas être utilisés car ils sont spécifiques à Unix. Vous devez copier un fichier de commandes Windows pre-revprop-change.bat dans le répertoire des crochets, par exemple. celui fourni ici .

87
Alex. S.

Voici une variante pratique que je ne vois pas mentionnée dans les FAQ. Vous pouvez renvoyer le message actuel pour modification en spécifiant un éditeur de texte.

svn propedit svn:log --revprop -r N --editor-cmd vim
46
mcqwerty
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
36
nickf

J'ai été récemment chargé de cela aussi.

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

Après avoir regardé quelques exemples en ligne, j’ai corrigé cela ensemble, nous sommes dans un environnement Windows, c’est donc le 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 vient de ce fil :

17
Josh Weatherly

Sous Windows, en utilisant le client SVN Tortoise:

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

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

15
Andrei N.

Si vous utilisez un IDE comme Eclipse, vous pouvez utiliser ce moyen simple.

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
mani_nz

Si votre référentiel permet de définir les propriétés de révision via le hook pre-revprop-change, vous pouvez modifier les messages de journal beaucoup plus facilement.

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

Ou dans TortoiseSVN, AnkhSVN et probablement de nombreux autres clients Subversion en cliquant avec le bouton droit de la souris sur une entrée du journal, puis sur "modifier le message du journal".

9
Bert Huijben

La Subversion FAQ couvre cela, mais utilise un tas de termes indéfinis déroutants tels que REPOS_PATH sans donner d’exemples concrets.

Cela peut prendre quelques tentatives pour que cela fonctionne, donc enregistrez votre message de validation mis à jour dans un fichier. Contrairement aux fichiers svn-commit.tmp, Subversion ne conservera pas votre saisie en cas de problème.

Dans votre répertoire de travail, exécutez

svn propedit -r N --revprop svn:log

pour éditer le message de commit. Si cela fonctionne, génial! Mais ce ne sera probablement pas le cas, car la propriété de révision svn:log est non versionnée et que Subversion par défaut vous empêchera de l'écraser, soit avec le script de hookpre-revprop-change, soit une erreur message que vous n'avez pas un tel crochet.

Pour changer les points d'ancrage, vous devez avoir accès au système de fichiers sur lequel le référentiel est hébergé. svn info vous indiquera la racine du référentiel. Supposons qu’il s’agisse de ~/svnrepo.

  1. cd à ~/svnrepo/hooks
  2. Existe-t-il un script pre-revprop-change ou pre-revprop-change.bat? Si c'est le cas, commentez temporairement la partie de celle-ci qui échoue si vous essayez de modifier svn:log.
  3. Sinon, sous Windows, créez un fichier vierge appelé pre-revprop-change.bat. Voici une façon de le faire:

    copy con pre-revprop-change.bat
    ^Z
    
  4. Sinon, sous Unix, lancez

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

  6. Annulez vos modifications dans ~/svnrepo/hooks/svn-revprop-change (.bat)
2
andrewdotn