web-dev-qa-db-fra.com

Supprimer tous les ensembles de modifications locaux et revenir à l'arborescence

J'utilise Mercurial et je suis dans un sale pétrin localement, avec trois têtes. Je ne peux pas pousser, et je veux juste supprimer toutes mes modifications et validations locales et recommencer avec un code totalement propre et un historique propre.

En d'autres termes, je veux finir avec (a) exactement le même code localement que celui qui existe dans la pointe de la branche distante et (b) aucun historique de commits locaux.

Je sais hg update -C écrase toutes les modifications locales. Mais comment supprimer les validations locales?

Pour être clair, je n'ai aucun intérêt à préserver le travail que j'ai fait localement. Je veux juste le moyen le plus simple de revenir à une caisse locale totalement propre.

94
Richard

Lorsque la manière la plus simple (un nouveau hg clone) n'est pas pratique, j'utilise hg strip:

% hg outgoing -l 1
% hg strip $rev # replace $rev with the revision number from outgoing

Répète jusqu'à hg outgoing reste silencieux. Notez que hg strip $rev efface $rev et tous ses descendants.

Notez que vous devrez peut-être activer d'abord strip dans vos paramètres Mercurial .

PS: une approche encore plus intelligente consiste à utiliser le langage revset et à:

% hg strip 'roots(outgoing())'
128
just somebody

Vous souhaiterez créer un clone local dans lequel vous ne conserverez que les ensembles de modifications également présents dans le référentiel distant. Utilisez TortoiseHg , hg log ou similaire pour déterminer laquelle de vos révisions est la dernière révision que vous n'avez pas faites (celle avant le début du désordre). En utilisant hg outgoing peut vous aider ici - il listera tous les changements que vous avez effectués - choisissez un numéro de révision plus tôt que n'importe lequel d'entre eux.

Si la révision cible est appelée good et que votre clone est appelé foo, procédez comme suit:

hg clone -r good foo foo-clean

Ce sera une opération locale rapide - il n'y a aucune raison de tout télécharger à nouveau . Le foo-clean le clone ne contiendra que les modifications jusqu'à la révision good. Vous pouvez maintenant remplacer foo-clean/.hg/hgrc avec foo/.hg/hgrc afin de conserver vos paramètres locaux du référentiel tels que le chemin Push/Pull par défaut.

Lorsque vous êtes convaincu que foo-clean contient tout ce dont vous avez besoin dans foo, puis supprimez simplement foo et renommez foo-clean à foo. Fait une hg pull pour obtenir tous les nouveaux changements du référentiel distant dans votre clone et continuer comme d'habitude.


Si personne n'a poussé de nouveaux ensembles de modifications vers le référentiel distant, il est très simple de déterminer la révision que vous souhaitez utiliser comme good ci-dessus: hg id default vous indiquera l'ID de la pointe dans le référentiel distant.

21
Martin Geisler

D'accord. Il suffit donc de supprimer tous les éléments locaux, hg init le nouveau référentiel local et hg pull le dernier conseil que vous avez. N'oubliez pas de hg update après ça.

9
alemjerus

Vous pouvez utiliser

révision de la bande hg

pour supprimer toute révision et sa sous-arborescence dans votre référentiel local.

https://www.Mercurial-scm.org/wiki/Strip

Mais n'essayez pas de l'utiliser pour tout ce qui a déjà été poussé.

5
averasko
hg strip `hg out --template" {rev} {author}\n "| grep YOUR_AUTHOR_NAME | cut -d "" -f 1`

fait l'affaire pour moi.

Il supprime toutes les révisions qui ne sont pas poussées vers le référentiel par défaut qui sont créées avec votre nom d'auteur.

Vous pouvez également utiliser ce style pour qu'il ne vérifie pas avec le référentiel par défaut mais avec un autre référentiel

hg strip `hg out OTHER_REPO_ALIAS --template" {rev} {author}\n "| grep YOUR_AUTHOR_NAME | cut -d "" -f 1`
2
Sebastian

Supprimez simplement tout ce que vous avez sur votre système local et re-clonez le référentiel distant.

2
OJ.

Si vous utilisez TortoiseHg, un moyen simple de sortir d'un (petit) gâchis est de commencer par mettre à jour la dernière révision, puis de sélectionner vos changesets et de lancer la "fusion avec local". Lorsque la boîte de dialogue de fusion apparaît, cliquez simplement sur la petite icône "+" pour afficher des options supplémentaires, dont l'une est "annuler les changements de la cible de fusion (autre) révision". Cela signifie que vos changements seront toujours dans le référentiel et seront poussés, mais n'auront aucun effet, car ils seront rejetés lors de la fusion. Si vous avez beaucoup de changesets couvrant plusieurs têtes, vous ne voudrez peut-être pas polluer le dépôt de cette façon, mais c'est une solution simple et vaut la peine d'être considérée si les changesets que vous supprimez contiennent des données que vous voudrez peut-être ultérieurement référencer.

0
MrFlamey