Supprimer tout et obtenir une copie propre de la dernière révision?

159

Je déplace un processus de construction pour utiliser mercurial et je souhaite ramener le répertoire de travail à l'état de la dernière révision. Les exécutions précédentes du processus de construction auront modifié certains fichiers et ajouté des fichiers que je ne veux pas valider, donc j'ai des modifications locales et des fichiers qui ne sont pas ajoutés au référentiel.

Quel est le moyen le plus simple de supprimer tout cela et d'obtenir un répertoire de travail propre contenant la dernière révision?

Actuellement, je fais ceci:

hg revert --all
<build command here to delete the contents of the working directory, except the .hg folder.>
hg pull
hg update -r MY_BRANCH

mais il semble qu'il devrait y avoir un moyen plus simple.

Je veux faire l'équivalent de la suppression du dépôt, faire un nouveau clone et une mise à jour. Mais le repo est trop gros pour que cela soit assez rapide.

Rory
la source
1
Est-ce que "(supprimer le contenu ...)" est un commentaire sur la commande "revert --all" ou une étape que vous effectuez? Je demande parce que "hg update" ne mettra à jour que les fichiers qui ont changé. Si vous supprimez d'autres fichiers avant la mise à jour, vous ne les récupérerez pas à moins que vous ne reveniez à la révision nulle ( hg update 00), puis que vous ne reveniez à la pointe. Pourquoi ne hg revert --allsuffit-il pas de revenir à un état de dossier de travail cohérent avant l'extraction et la mise à jour?
Lasse V.Karlsen
c'est une étape distincte effectuée avec mon logiciel de construction. (J'aurais pu simplement utiliser une suppression de ligne de commande, mais je ne l'ai pas fait.)
Rory
1
Vous pourriez trouver la archivecommande utile dans le futur. Par exemple, vous pourriez hg archive ../newbuild, et un instantané de votre référentiel au dernier hg updatesera placé là. Je fais généralement cela pour les builds nocturnes juste pour ne pas risquer d'encombrer mon repo. Supprimez simplement le répertoire de construction lorsque vous n'en avez plus besoin.
Tim Post

Réponses:

212

Ces étapes devraient pouvoir être réduites à:

hg pull
hg update -r MY_BRANCH -C

L' -Cindicateur indique à la commande de mise à jour d'annuler toutes les modifications locales avant la mise à jour.

Cependant, cela peut laisser des fichiers non suivis dans votre référentiel. Il semble que vous souhaitiez vous en débarrasser également, alors j'utiliserais l' purgeextension pour cela:

hg pull
hg update -r MY_BRANCH -C
hg purge

Dans tous les cas, il n'y a pas une seule commande que vous pouvez demander à Mercurial d'exécuter qui fera tout ce que vous voulez ici, sauf si vous changez le processus pour cette méthode de "clonage complet" que vous dites ne pas pouvoir faire.

Lasse V. Karlsen
la source
6
Merci, c'était la «purge» dont j'avais besoin. La mise à jour -C ne supprime pas les fichiers non suivis, ce qui est la principale chose avec laquelle je luttais.
Rory
4
Vous pouvez également utiliser TortoiseHg pour purger. Il vous suffit d'activer l'extension dans les paramètres de l'atelier (ou d'éditer mercurial.ini).
Dave
18
Si l'extension de purge n'est pas activée, vous pouvez également utiliser la commande comme ceci: hg --config "extensions.purge=" purge --all
Samuel Delisle
6
@ csharptest.net hg purge --allvient de me donner un bon mal de tête, car il a également effacé mes configurations locales, c'est-à-dire: utilisateur / mot de passe de la base de données, etc. :)
VMC
@SamuelDelisle merci bien monsieur, je ne voulais pas faire de changements de configuration juste pour cette commande unique dans mon script!
joonas.fi
113
hg up -C

Cela supprimera toutes les modifications et mettra à jour la dernière tête de la branche actuelle.

Et vous pouvez activer l' extension de purge pour pouvoir également supprimer tous les fichiers non versionnés.

zerkms
la source
Cela inclut-il les fichiers non suivis? J'ai eu quelques problèmes avec ceux des autres commandes que j'essayais. Je vais essayer maintenant ...
Rory
7
@Rory: non, hg purgeest pour les fichiers non versionnés.
zerkms
10

Pour supprimer non suivi sur * nix sans l'extension de purge, vous pouvez utiliser

hg pull
hg update -r MY_BRANCH -C
hg status -un|xargs rm

Qui utilise

update -r --rev REV révision

update -C --clean supprime les modifications non validées (pas de sauvegarde)

status -u --unknown affiche uniquement les fichiers inconnus (non suivis)

status -n --no-status masque le préfixe d'état

KCD
la source
4

Si vous recherchez une méthode simple , essayez-la.

Pour ma part, je peux à peine me souvenir des lignes de commande pour tous mes outils, j'ai donc tendance à le faire en utilisant l'interface utilisateur:


1. Sélectionnez d'abord "commit"

Commettre

2. Ensuite, affichez les fichiers ignorés. Si vous avez des modifications non validées, masquez-les.

Afficher les fichiers ignorés

3. Maintenant, sélectionnez-les tous et cliquez sur "Supprimer les versions non versionnées".

Supprime-les

Terminé. C'est une procédure qui est beaucoup plus facile à retenir que les éléments de ligne de commande.

bytecode77
la source
Je ne suis pas sûr (j'utilise moi-même SourceTree), mais ces captures d'écran semblent provenir de TortoiseHg Workbench. En général, je pense que les solutions basées sur l'interface utilisateur sont utiles, mais cette réponse nécessite un meilleur étiquetage. De plus, "les cacher" me semble un peu vague.
Jon Coombs
3

hg status vous montrera tous les nouveaux fichiers, puis vous pourrez simplement les rm .

Normalement, je veux me débarrasser des fichiers ignorés et non versionnés, donc:

hg status -iu                          # to show 
hg status -iun0 | xargs -r0 rm         # to destroy

Et puis suivez cela avec:

hg update -C -r xxxxx

qui met tous les fichiers versionnés dans le bon état pour la révision xxxx


Pour suivre la tradition de Stack Overflow de vous dire que vous ne voulez pas faire cela, je trouve souvent que cette «option nucléaire» a détruit des choses qui me tiennent à cœur.

La bonne façon de le faire est d'avoir une option «make clean» dans votre processus de construction, et peut-être aussi «make reallyclean» et «make distclean».

John Lawrence Aspden
la source