Comment modifier le message du journal déjà validé dans Subversion?

550

Existe-t-il un moyen de modifier le message du journal d'une certaine révision 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 modifier un message de validation incorrect dans Git? , mais la solution à cette question ne semble pas être similaire pour Subversion (selon svn help commit).

Jeremy Ruten
la source
26
J'allais voter pour cette question, mais j'ai réalisé que je l'avais déjà fait il y a 4 mois :)
oksayt
6
S'il s'agit de code, faites simplement quelques commentaires et validez à nouveau avec les commentaires appropriés. Si vous êtes d'accord avec vos commentaires reflétant l'erreur, c'est beaucoup moins d'efforts et beaucoup plus rapide. Sinon, la solution de Kamil Kisiel est clairement la bonne façon de le faire.
marty
Il existe un excellent pre-revprop-changescript qui permet à l'utilisateur qui s'engage de modifier son journal jusqu'à 3 heures après la validation. Il s'agit d'un excellent compromis entre flexibilité / journaux précis et maintien de la fidélité du référentiel: wandisco.com/svnforum/threads/…
jwa
si vous ne pouvez pas modifier le fichier mais que vous souhaitez toujours ajouter un nouveau message de validation, vous pouvez le fairesvn propset dummyproperty 1 yourfile; svn commit yourfile -m yourmessage
mulllhausen

Réponses:

457

Pour ce faire, vous devez essentiellement avoir des droits d'administrateur (directement ou indirectement) sur le référentiel. Vous pouvez soit configurer le référentiel pour permettre à tous les utilisateurs de le faire, soit modifier le message du journal directement sur le serveur.

Voir cette partie de la FAQ Subversion (soulignement le mien):

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 est 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 essaie de vous empêcher de le faire accidentellement. Cependant, il existe plusieurs façons d'obtenir que Subversion modifie une propriété de révision.

La première façon consiste pour l'administrateur du référentiel à activer les modifications des propriétés de révision. Cela se fait en créant un hook appelé "pre-revprop-change" (voir cette section dans le livre Subversion pour plus de détails sur la façon de procéder). Le hook "pre-revprop-change" a accès à l'ancien message de journal avant qu'il ne soit modifié, il peut donc le conserver d'une manière ou d'une autre (par exemple, en envoyant un e-mail). Une fois les modifications des propriétés de révision activées, vous pouvez modifier le message du journal d'une révision en passant le commutateur --revprop à svn propedit ou svn propset, comme l'un des deux:

$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 à partir d'une copie de travail, vous pouvez laisser l'URL.

La deuxième façon de modifier un message de journal consiste à utiliser svnadmin setlog. Cela 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 est le numéro de révision dont vous souhaitez modifier le message de journal et FILE est 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 de 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 contourner des éléments tels que les notifications par e-mail de la modification ou des systèmes de sauvegarde qui gardent une trace des propriétés de révision.

Kamil Kisiel
la source
15
Au 3 février 2010, l'URL était subversion.apache.org/faq.html#change-log-msg
GreenMatt
1
Voici une implémentation de base pour l'option svnadmin svn-change-commit
albfan
2
Merci! Toujours utile 6,5 ans après la réponse. :-)
Michael
La méthode propedit a plus ou moins fonctionné; cependant, je n'ai pas pu refléter la modification du journal dans le navigateur de dépôt. Je ne pouvais voir que le journal mis à jour dans la ligne de commande svn dans Windows. J'ai dû actualiser le cache du journal comme étape finale: stackoverflow.com/questions/25750249/…
user_007
89

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 hook pré-revprop-change du référentiel ait échoué ou soit inexistant

C'est parce que Subversion ne vous permet pas de modifier les messages du journal car ils ne sont pas versionnés et seront définitivement perdus.

SVN hébergé sous Unix

Allez dans le répertoire hooks de votre serveur Subversion (remplacez ~ / 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

Rendez-le exécutable (ne peut pas faire chmod + x!)

chmod 755 pre-revprop-change

La source

SVN hébergé par Windows

Les fichiers de modèle dans le 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.batdans le répertoire hooks, par exemple celui fourni ici .

Alex. S.
la source
1
Pourquoi avez-vous écrit entre parenthèses " ne peut pas faire chmod + x!"?
Apôtre
1
J'ai créé un petit script qui implémente la même idée ici blog.mmonem.com/enable-changing-svn-log
mmonem
SVN_EDITOR, VISUAL ou EDITOR doivent être définis avant d'utiliser svn propedit
Gerd
48

Voici une variante pratique que je ne vois pas mentionnée dans la 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
mcqwerty
la source
17
Cela nécessite que le hook ait été créé - ce qui nécessite des droits d'administrateur. svn: Repository has not been enabled to accept revision propchanges; ask the administrator to create a pre-revprop-change hook
Matt
Voici un script pour activer le journal: blog.mmonem.com/enable-changing-svn-log
mmonem
37
svnadmin setlog /path/to/repository -r revision_number --bypass-hooks message_file.txt
nickf
la source
J'utilise Google Code, donc je ne pense pas pouvoir le faire de cette façon, mais merci.
Jeremy Ruten
4
cela a fonctionné pour moi car la méthode propedit a échoué avec "Le référentiel n'a pas été activé pour accepter les modifications de révision". Merci!
pfctdayelise
1
+1 pour avoir donné la commande directement :-) apache.org était en panne en ce moment et je ne pouvais suivre aucun lien donné ...
Rafa
Cette réponse mérite plus de points! C'est mieux parce que vous n'avez pas à configurer le crochet pour l'utiliser.
Peri Hartman, le
1
bump pour cette réponse, a fonctionné pour moi sans configurer le hook, n'a pas non plus changé la révision "date / heure" dans le journal, juste le message, qui était exactement ce que j'espérais.
segFaultCoder
17

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

Nous voulions permettre à nos programmeurs de modifier uniquement leurs propres messages de validation et de limiter la distance à laquelle ils sont autorisés à le faire. Nous avons décidé qu'ils seraient autorisés à modifier tous les messages de journal commis ce jour-là, à corriger les fautes de frappe, etc.

Après avoir regardé quelques autres exemples en ligne, j'ai piraté cela ensemble, nous sommes dans un environnement Windows, voici 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: L'idée originale pour cela est venue de ce fil :

Josh Weatherly
la source
7
Pour une raison quelconque, sur mon système (exécutant Server 2012 et VisualSVN), lors de la dernière vérification de date if /I not '%DATESTAMPDAY%'=='%DAY%' goto ERROR_MSGTOOOLD, j'ai dû passer à des guillemets doubles autour des deux variables. (Vous ne croiriez pas combien de temps cela a pris pour comprendre.) Sinon, j'obtiendrais des choses comme "== '02' est inattendu en ce moment" (le 2ème jour du mois). Mon batch-fu n'est pas assez fort pour savoir pourquoi cela se produit, mais au cas où quelqu'un d'autre rencontrerait des problèmes étranges, cela pourrait aider.
Carl Bussema
@CarlBussema: Merci pour cette friandise. Vous venez de me sauver un énorme mal de tête.
Daniel Szabo
1
Notez également que le script ci-dessus utilise le format de date américain, "Expects date in the format: Thu 08/01/2013" . Donc, si vous ne l'utilisez pas, vous devez modifier cette partie, dans mon cas, le format était "mm.dd.yy", et sans le jour de la semaine.
Zitrax
C'est une variante sympa de cette belle réponse: stackoverflow.com/questions/6155/…
NateJ
17

Sous Windows, en utilisant le client Tortoise SVN:

  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 pourrait être dû à la configuration de SVN sur le serveur, lisez les autres réponses ici.

Andrei N.
la source
Merci, c'était une solution plus facile pour moi, +1. Est essentiel d'avoir des autorisations.
theGabyRod
12

Si vous utilisez un IDE comme eclipse, vous pouvez utiliser cette méthode simple.

Right click on the project -> Team - Show history

En cela 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.

mani_nz
la source
Au moins dans TortoiseSVN, la tentative de modification des propriétés de validation pour une validation dans le journal de validation échoue avec le même message d'erreur que la modification directe du message de journalisation.
Christian Severin
1
"La demande DAV a échoué; il est possible que le hook de pré-révprop-changement du référentiel ait échoué ou est inexistant. Le référentiel n'a pas été activé pour accepter les changements de prop. De révision; demandez à l'administrateur de créer un hook de pré-revprop-changement". Mais comme je l'ai dit: c'est en utilisant TortoiseSVN (en tant que non-administrateur), pas Eclipse. Peut-être qu'Eclipse pirate les autorisations SVN pour créer ce hook, je ne sais pas.
Christian Severin
Ouais peut-être. Essayez de le faire en éclipse.
mani_nz
@ChristianSeverin, j'obtiens le même message d'erreur lors de l'utilisation d'Eclipse. Cela vient sûrement du serveur Subversion.
GreenhouseVeg
10

Si votre référentiel permet de définir les propriétés de révision via le hook pré-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 de subversion en cliquant avec le bouton droit sur une entrée de journal, puis en modifiant le message de journal.

Bert Huijben
la source
2
dans Subclipse (Eclipse) c'est "Set Commit Properties".
pfctdayelise
2

La FAQ Subversion couvre cela, mais utilise un tas de termes indéfinis confus comme REPOS_PATHsans donner d'exemples réels.

Cela peut prendre quelques essais pour le faire fonctionner, alors enregistrez votre message de validation mis à jour dans un fichier. Contrairement aux svn-commit.tmpfichiers, Subversion ne conservera pas votre frappe en cas de problème.

Dans votre répertoire de travail, exécutez

svn propedit -r N --revprop svn:log

pour modifier le message de validation. Si cela fonctionne, tant mieux! Mais ce ne sera probablement pas le cas, car la svn:logpropriété de révision n'est pas versionnée et Subversion par défaut vous empêchera de l'écraser, soit avec le script de hook , soit avec pre-revprop-changeun message d'erreur indiquant que vous n'avez pas un tel hook.

Pour modifier les hooks, vous devez avoir accès au système de fichiers sur lequel le référentiel est hébergé. svn infovous indiquera la racine du référentiel. Supposons que ce soit ~/svnrepo.

  1. cd à ~/svnrepo/hooks
  2. Y a-t-il un script pre-revprop-changeou pre-revprop-change.bat? Si tel est le cas, mettez temporairement en commentaire la partie de celle-ci qui est abandonnée si vous essayez de changer svn:log.
  3. Sinon, sous Windows, créez un fichier vierge appelé pre-revprop-change.bat. Voici une façon de procéder:

    copy con pre-revprop-change.bat
    ^Z
    
  4. Sinon, sous Unix, exécutez

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

  6. Annuler vos modifications dans ~/svnrepo/hooks/svn-revprop-change( .bat)
andrewdotn
la source
0

J'ai trouvé une bonne implémentation du crochet pré-rév-prop-change côté serveur sur le svnforum: https://www.svnforum.org/forum/opensource-subversion-forums/scripts-contributions/8571-pre-revprop-change -shell-script-allow-commiters-to-change-own-log-within-x-hours

Il implémente

  • vérification par l'utilisateur, c'est-à-dire que seuls les messages de validation peuvent être modifiés.
  • Remplacement de l'administrateur Svn; l'administrateur peut modifier n'importe quoi.
  • comparaison d'horodatage: seuls les validations inférieures à une certaine heure peuvent être modifiées

Prenez-le à partir de là et modifiez-le à volonté. Je préfère ne pas le copier ici car je ne suis pas l'auteur original et il n'y a pas d'avis de droit d'auteur qui me permettrait de le faire.

teroi
la source