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


Existe-t-il un moyen d’éditer le message de 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 être déroutant plus tard.

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


512
2017-11-20 05:13


origine


Réponses:


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

Voir cette partie du FAQ Subversion (Je souligne):

Les messages de journal sont conservés dans   référentiel en tant que propriétés attachées à   chaque révision. Par défaut, le journal   La propriété de message (svn: log) ne peut pas être   édité une fois qu'il est engagé. C'est   car les modifications apportées aux propriétés de révision   (dont svn: log est un) provoque le   la valeur précédente de la propriété à être   définitivement rejeté, et Subversion   essaie de vous empêcher de le faire   accidentellement. Cependant, il y a un   deux façons d'obtenir Subversion à   changer une propriété de révision.

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

$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 d'un travail   copier, vous pouvez laisser l'URL.

La deuxième façon de changer un journal   message est d'utiliser svnadmin setlog.    Cela doit être fait en se référant à la   l'emplacement du dépôt sur le   système de fichiers. Vous ne pouvez pas modifier une télécommande   référentiel utilisant 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 vous souhaitez modifier le message de connexion,   et FILE est un fichier contenant le nouveau   message de journal. Si la   Le crochet "pre-revprop-change" n'est pas dans   placer (ou vous voulez contourner le crochet   script pour une raison quelconque), vous pouvez aussi   utilisez l'option --bypass-hooks.   Cependant, si vous décidez d'utiliser cette   option, soyez très prudent. Tu es peut-être   contournant des choses telles que l'email   notifications de la modification ou sauvegarde   systèmes qui gardent la trace de la révision   Propriétés.


423
2017-11-20 05:16



Lorsque vous exécutez cette commande,

svn propedit svn:log --revprop -r NNN 

et juste au cas où vous voyez ce message:

La requête DAV a échoué; C'est possible que   le pré-revprop-change du dépôt   crochet a échoué ou est inexistant

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

Accédez au répertoire hooks de votre serveur Subversion (remplacez ~ / svn / reponame par le répertoire de votre référentiel)

cd ~/svn/reponame/hooks

Supprimer l'extension

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

Rendez-le exécutable (impossible de faire chmod + x!)

chmod 755 pre-revprop-change

La source


77
2018-06-18 21:54



Voici une variation pratique que je ne vois pas mentionnée dans la faq. Vous pouvez renvoyer le message en cours pour modification en spécifiant un éditeur de texte.

svn propedit svn:log --revprop -r N --editor-cmd vim

41
2018-04-12 21:37



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

35
2017-11-20 05:17



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

Nous voulions permettre à nos programmeurs de ne modifier que leurs propres messages de validation, et 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 validés ce jour-là, à corriger les fautes de frappe, etc.

Après avoir examiné quelques autres exemples en ligne, je les ai piratés ensemble, nous sommes dans un environnement Windows, voilà 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: idée originale pour cela est venu de ce fil:


16
2017-08-01 21:55



Si vous utilisez un EDI 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 d'ici.


12
2017-12-26 11:25



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 Messages du journal, faites un clic droit sur une révision et choisissez "Modifier le message du journal"

Si cela ne fonctionne pas, c'est peut-être à cause de la configuration du SVN sur le serveur, lisez les autres réponses ici.


12
2017-09-15 06:06



Si votre référentiel active la définition des propriétés de révision via le hook pre-revprop-change, vous pouvez modifier les messages du journal 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 sur une entrée de journal puis en changeant le message de journal.


7
2017-11-20 10:32



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

Cela peut prendre quelques tentatives pour le faire fonctionner, alors enregistrez votre message de validation mis à jour dans un fichier. Contrairement à svn-commit.tmp fichiers, 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 modifier le message de validation. Si ça marche, génial! Mais ça ne le sera probablement pas, parce que le svn:log La propriété revision n'est pas versionnée et Subversion par défaut vous empêchera de l'écraser, soit avec script crochet  pre-revprop-changeou un message d'erreur indiquant que vous ne possédez pas un tel crochet.

Pour changer les crochets, vous devez accéder au système de fichiers sur lequel le référentiel est hébergé. svn info vous dira la racine du dépôt. Supposons que ce soit ~/svnrepo.

  1. cd à ~/svnrepo/hooks
  2. y a t-il pre-revprop-change ou pre-revprop-change.bat scénario? Si oui, commentez temporairement le une partie de celui qui avorte si vous essayez de changer svn:log.
  3. Sinon, sur Windows, créez un fichier vide 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, exécutez svn propedit -r N --revprop svn:log encore

  6. Annuler vos modifications ~/svnrepo/hooks/svn-revprop-change(.bat)

2
2017-08-07 14:43