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?
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).
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
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
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
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
.
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)
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.
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:
[extensions] mq =
hg up <rev>
hg qimport -r.
hg qrefresh -e
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 *").
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
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.
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
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.