93 votes

Avec Mercurial, comment peux j’ai « compresser » une série d’ensembles de modifications en une seule avant de pousser ?

Disons que j'ai un local et à distance dépôt Mercurial. Maintenant, je commence à travailler sur un long métrage. Je travaille sur elle, et quand je pense que c'est fait, j'ai commis l'ensemble de modifications. De le tester un peu plus, je trouve que je pourrait améliorer encore cette fonctionnalité en modifiant quelque chose dans le code. Je fais le changement et de s'engager. 20 minutes plus tard, j'ai trouver il y a un bug dans cette nouvelle fonction, j'ai donc le corriger et de s'engager à ce que trop.

J'ai maintenant 3 ensembles de modifications que je voudrais vraiment pousser vers le dépôt distant comme un ensemble de modifications avec le message "la mise en Œuvre de la caractéristique X", par exemple.

Comment puis-je le faire sans trop de tracas? Je crois que je pourrais le faire avec des taches, mais il semble que beaucoup de travail.

48voto

Stefan Rusek Points 2437

Le histedit extension est exactement ce que vous cherchez.

hg histedit -o

ou

hg histedit --outgoing

une liste des sortants des révisions. À partir de la liste, vous pouvez

  • Replier 2 ou plusieurs ensembles de modifications de la création d'un seul ensemble de modifications
  • Déposer des révisions de les enlever de l'histoire
  • Réorganiser les révisions toutefois vous le souhaitez.

histedit vous invite pour le nouveau message de livraison de plis de révisions dont la valeur par défaut pour les deux messages avec "\n***\n" séparant.

Vous pouvez également obtenir des résultats similaires en utilisant la mq extension, mais il est beaucoup plus difficile.

Vous pouvez également utiliser l'effondrement de l'extension de simplement faire de pliage, mais il ne fournit pas beau de l'INTERFACE utilisateur et ne fournit pas un moyen de modifier l'résultant message de commit. L'édition de l'résultant message de commit permet également de nettoyer le message final, qui est quelque chose que j'ai toujours utilise.

37voto

Steve Losh Points 11958
<p>Que diriez-vous à l' <a href="http://mercurial.selenic.com/wiki/CollapseExtension">Extension de l’effondrement</a>?</p>

19voto

Arkady Points 4015

Oui, vous pouvez le faire avec des taches: Supposons que votre travail est dans les révisions de 100 à 110, inclusive

  1. Créer un patch:

    % hg export -o mypatch 100:110 --git

  2. Mise à jour à 99:

    % hg update 99

  3. Appliquer le patch avec l'option --no-commit (sinon, vous obtiendrez tous vos révisions):

    % hg import --no-commit mypatch

  4. Valider toutes les modifications à la fois:

    % hg commit

  5. Vous avez maintenant deux têtes (110 et 111), qui devrait être équivalent en termes de fichiers qu'ils produisent dans votre répertoire de travail, peut-être que de diff pour la santé mentale avant de démonter les anciennes:

    % hg strip 100

OK, maintenant que j'ai écrit, il ne semble pas très longue, mais de l'avoir fait un tas de fois moi-même, je ne trouve pas qu'il soit trop une corvée...

19voto

Rageous Points 858

Si vous êtes en utilisant l'interface graphique, l'utilisation de sélectionner deux révisions (utilisez la touche CTRL pour sélectionner des pas ultérieurs), droit de la souris et sélectionnez "Compresser l'Histoire".

Après cela, vous aurez une nouvelle modification de la liste en tête à partir de la première modification que vous avez sélectionné avant, il contiendra tous les descendants de modifier les listes d'entre ceux que vous avez sélectionnés.

Vous pouvez simplement sortir la bande de vieilles listes de changements si vous ne les avez plus besoin: utiliser MQ extensions. Encore une fois, dans le GUI: clic droit sur le premier changement de la liste qui doit être retiré avec tous ses descendants, "Modifier l'Histoire -> la Bande".

18voto

Chris Phillips Points 2923

Ma méthode de prédilection de l'utilisation de la mq pour ce pliage est à l'aide de TortoiseHg , comme décrit ici. Cependant, il peut facilement être fait à partir de la ligne de commande comme ceci:

hg qimport -r <first>:<last> 
    -- where <first> and <last> are the first and last changesets 
    -- in the range of revisions you want to collapse

hg qpop <first>.diff
    -- remove all except for the first patch from the queue
    -- note: mq names patches <#>.diff when it imports them, so we're using that here

hg qfold <next>.diff
    -- where <next> is <first>+1, then <first>+2, until you've reached <last>

hg qfinish -a
    -- apply the folded changeset back into the repository

(Il peut y avoir une meilleure façon de faire la qfold étape, mais je ne suis pas au courant de cela, comme j'ai l'habitude d'utiliser TortoiseHg pour cette opération.)

Il semble un peu compliqué au premier abord, mais une fois que vous avez commencé à utiliser la mq, c'est assez simple et le plus naturel: plus vous pouvez faire toutes sortes d'autres choses avec mq qui peut être bien pratique!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: