web-dev-qa-db-fra.com

Comment éditer un message de commit incorrect dans Mercurial?

J'utilise actuellement TortoiseHg (Mercurial) et ai accidentellement envoyé un message de validation incorrect. Comment puis-je modifier ce message de validation dans le référentiel?

332
maxyfc

Mise à jour: Mercurial a ajouté --amend qui devrait être l'option préférée maintenant .


Vous pouvez annuler le dernier commit (mais seulement le dernier) avec hg rollback puis le réappliquer.

Important : this supprime définitivement le dernier commit (ou extrait). Donc, si vous avez fait un hg update que la validation ne figure plus dans votre répertoire de travail, elle est définitivement perdue. Donc faites d'abord une copie.

En dehors de cela, vous ne pouvez pas modifier l'historique du référentiel (y compris les messages de validation), car tout ce qu'il contient est résumé. La seule chose que vous puissiez faire est de supprimer l’historique après un jeu de modifications donné, puis de le recréer en conséquence.

Tout cela ne fonctionnera pas si vous avez déjà publié vos modifications (à moins que vous ne puissiez obtenir toutes les copies) et que vous ne pouvez pas non plus "réécrire l'historique" incluant les commits signés par GPG (par d'autres personnes).

246
Thilo

Eh bien, je faisais comme ça:

Imaginez, vous avez 500 commits, et votre message de validation erroné est dans r.498.

hg qimport -r 498:tip
hg qpop -a
joe .hg/patches/498.diff
(change the comment, after the Mercurial header)
hg qpush -a
hg qdelete -r qbase:qtip
90
Antonio Beamud

Bonne nouvelle: hg 2.2 récemment ajouté git comme l'option --amend.

et dans tortoiseHg, vous pouvez utiliser "Modifier la révision actuelle" en sélectionnant la flèche noire à droite du bouton de validation

a

68
prime23

Je sais que ceci est un ancien post et vous avez marqué la question comme réponse. Je cherchais la même chose récemment et j'ai trouvé l'extension histedit très utile. Le processus est expliqué ici:

http://knowledgestockpile.blogspot.com/2010/12/changing-commit-message-of-revision-in.html

45
Curious2learn

La dernière opération était le commit en question

Pour modifier le message de validation de la dernière validation lorsque la dernière opération Mercurial était une validation, vous pouvez utiliser

$ hg rollback

pour annuler le dernier commit et le re-commettre avec le nouveau message:

$ hg ci -m 'new message'

Mais soyez prudent, car la commande rollback annule également les opérations suivantes:

  • importation
    • tirer
    • Push (avec ce référentiel comme destination)
    • dégrouper

(voir hg help rollback)

Ainsi, si vous n'êtes pas sûr que la dernière commande Mercurial soit un hg ci, n'utilisez pas hg rollback.

Changer tout autre message de commit

Vous pouvez utiliser le mq extension , distribué avec Mercurial, pour modifier le message de validation de chaque validation.

Cette approche est utile uniquement lorsqu'il n'y a pas déjà de référentiels clonés dans le public contenant le jeu de modifications que vous souhaitez renommer, car cela modifie le hachage du jeu de modifications et tous les jeux de modifications suivants.

Cela signifie que vous devez être en mesure de supprimer tous les clones existants comprenant le jeu de modifications que vous souhaitez renommer, sinon vous ne pourriez pas forcer.

Pour utiliser l’extension mq, vous devez l’activer explicitement, par exemple. Sous UNIX, vérifiez votre ~/.hgrc, qui doit contenir les lignes suivantes:

[extensions]
mq=

Dites que vous souhaitez modifier la révision X - en premier qimport importe les révisions X et suivantes. Maintenant, ils sont enregistrés en tant que pile de correctifs appliqués. En sautant (qpop) la pile complète sauf X rend X disponible pour les modifications via qrefresh. Une fois le message de validation modifié, vous devez ré-appliquer tous les patchs (qpop) pour les réappliquer, c'est-à-dire recréer les révisions suivantes. La pile de patchs n’est pas nécessaire, elle peut donc être supprimée via qfinish.

Le script de démonstration suivant montre toutes les opérations en cours. Dans l'exemple, le message de validation du troisième jeu de modifications est renommé.

# test.sh
set -x -e -u
echo INFO: Delete old stuff
rm -rf .hg `seq 5`
echo INFO: Setup repository with 5 revisions
hg init
echo '[ui]' > .hg/hgrc
echo 'username=Joe User <[email protected]>' >> .hg/hgrc
echo 'style = compact' >> .hg/hgrc
for i in `seq 5`; do
  touch $i && hg add $i && hg ci -m "changeset message $i" $i
done
hg log 
echo INFO: Need to rename the commit message or the 3rd revision
echo INFO: Displays all patches
hg qseries
echo INFO: Import all revisions including the 3rd to the last one as patches
hg qimport -r 2:tip
hg qseries
echo INFO: Pop patches
hg qpop 2.diff
hg qseries
hg log 
hg parent
hg qrefresh -m 'CHANGED MESSAGE'
hg log 
echo INFO: Push all remaining patches
hg qpush -a
hg log 
hg qseries
echo INFO: Remove all patches
hg qfinish -a
hg qseries && hg log && hg parent

Copiez-le dans un répertoire vide et exécutez-le, par exemple. via:

$ bash test.sh 2>&1 | tee log

La sortie doit inclure le message de changement d'origine:

+ hg log
[..]
2   53bc13f21b04   2011-08-31 17:26 +0200   juser
  changeset message 3

Et l'opération de changement de nom du message modifié:

+ hg log
[..]
2   3ff8a832d057   2011-08-31 17:26 +0200   juser
  CHANGED MESSAGE

(Testé avec Mercurial 1.7.5)

20
maxschlepzig

Dans TortoiseHg, cliquez avec le bouton droit sur la révision à modifier. Choisissez Modifier l'historique-> Importer MQ. Cela convertira toutes les révisions jusqu'à la révision sélectionnée incluse dans les modifications Mercurial en correctifs Mercurial Queue. Sélectionnez le correctif pour lequel vous souhaitez modifier le message. L'écran deviendra automatiquement l'écran MQ Editor. Modifiez le message qui se trouve au milieu de l'écran, puis cliquez sur QReractualiser. Enfin, cliquez avec le bouton droit sur le correctif et choisissez Modifier l’historique-> Terminer le correctif, ce qui le convertira d’un correctif en un jeu de modifications.

Oh, cela suppose que MQ est une extension active de TortoiseHG sur ce référentiel. Sinon, vous devriez pouvoir cliquer sur Fichier-> Paramètres, sur Extensions et sur la case à cocher mq. Il devrait vous avertir que vous devez fermer TortoiseHg avant que l'extension ne soit active, fermez-la et rouvrez-la.

19
knockNrod

Comme d'autres l'ont mentionné, l'extension MQ est bien plus adaptée à cette tâche et vous ne courez pas le risque de détruire votre travail. Pour faire ça:

  1. Activez l’extension MQ en ajoutant quelque chose comme ceci à votre hgrc:
     [extensions] 
     mq = 
    
  2. Mettez à jour le jeu de modifications que vous souhaitez modifier, généralement un conseil:
     hg up <rev> 
    
  3. Importez le jeu de modifications actuel dans la file d'attente:
     hg qimport -r. 
    
  4. Actualisez le correctif et modifiez le message de validation:
     hg qrefresh -e 
    
  5. Terminez tous les patchs appliqués (un dans ce cas) et stockez-les en tant que changesets ordinaires:
     hg qfinish -a 
    

Je ne connais pas TortoiseHg, mais les commandes devraient être similaires à celles ci-dessus. Je pense aussi que cela vaut la peine de mentionner que l'historique de l'édition est risqué; vous ne devriez le faire que si vous êtes absolument certain que le jeu de modifications n'a pas été poussé ou tiré de nulle part ailleurs.

Annuler et réappliquer est une solution très simple, mais elle ne peut aider que lors du dernier commit. Mercurial Queues est beaucoup plus puissant (notez que vous devez activer Mercurial Queues Extension pour pouvoir utiliser les commandes "hg q *").

6
Anton N. Petrov

Un hack que j'utilise si la révision que je veux éditer n'est pas si ancienne:

Disons que vous êtes à la rév 500 et que vous souhaitez modifier 497.

hg export -o rev497 497
hg export -o rev498 498
hg export -o rev499 499
hg export -o rev500 500

Éditez le fichier rev497 et changez le message. (C'est après les premières lignes précédées de "#")

hg import rev497
hg import rev498
hg import rev499
hg import rev500
1
Doru Chiulan

Je l'ai fait de cette façon. Tout d'abord, n'appuyez pas sur vos modifications ou vous n'avez pas de chance. Saisissez et installez l'extension collapse . Commettez un autre changeset factice. Utilisez ensuite collapse pour combiner les deux jeux de modifications précédents en un seul. Il vous demandera un nouveau message de validation en vous donnant les messages que vous avez déjà comme point de départ. Vous avez effectivement modifié votre message de validation d'origine.

1
jls

Il existe une autre approche avec l'extension MQ et les commandes de débogage . C'est un moyen général de modifier l'historique sans perdre de données. Laissez-moi assumer la même situation que Antonio .

// set current tip to rev 497
hg debugsetparents 497
hg debugrebuildstate
// hg add/remove if needed
hg commit
hg strip [-n] 498
0
Crend King

Un petit bijou dans la discussion ci-dessus - merci à @Codest et @Kevin Pullin. Dans TortoiseHg, une option de menu déroulant est adjacente au bouton de validation. Sélectionner "Modifier la révision actuelle" ramène le commentaire et la liste des fichiers. SO utile.

0
Merlin