Comment supprimer tous les fichiers non suivis de mon répertoire de travail dans Mercurial?

207

Est-il possible de supprimer tous les fichiers non suivis de mon répertoire de travail? Disons que j'ai ajouté un tas de fichiers à mon répertoire de travail, que je ne les ai pas ajoutés via 'hg add' et que je veux maintenant me débarrasser complètement de ces nouveaux fichiers?

Je suis sur Windows, bien que j'utilise PowerShell, donc une solution combinée est également possible ici.

Valentin Vasilyev
la source

Réponses:

286

Ajoutez l'extension Mercurial appelée purge . Il est distribué par Mercurial.

Cette extension ajoute une commande de «purge» à «hg» qui supprime les fichiers inconnus de Mercurial. c'est-à-dire les fichiers non suivis. Donc, votre commande serait,

hg purge

Il n'est pas activé par défaut, peut-être pour éviter de supprimer accidentellement des fichiers que vous avez oublié d'ajouter.

Pour installer cette extension, ajoutez-la à votre fichier de paramètres mercurial (.hgrc sous Unix, Mercurial.ini sous Windows)

[extensions]
purge = 

Pour activer temporairement cette extension, vous pouvez utiliser

hg purge --config extensions.purge= 
Simplyharsh
la source
26
hg purge --allsupprimera tous les fichiers non suivis et ignorés. Ceci est utile pour nettoyer les builds en source
tacaswell
22
pour activer l'extension temporairement, vous pouvez utiliserhg purge --config extensions.purge=
Pykler
121

La bonne façon sans purge est:

hg st -un0 | xargs -0 rm
tonfa
la source
1
@simplyharsh est-ce mieux ou avez-vous trouvé cela moins efficace que d'ajouter l'extension?
Yaakov Kuperman
3
@YaakovKuperman Je suppose que l'ajout d'une extension est un travail moindre que cette commande (activation unique). Je n'active pas l'extension de purge car j'en ai besoin moins d'une fois tous les quinze jours. Appelez-moi aussi stupide mais, en tapant cette commande, vous aurez suffisamment de temps pour réfléchir avant de faire quelque chose d'aussi destructeur que la «purge».
Simplyharsh
2
@simplyharsh, cela a du sens, mais il y a tout de même deux raisons pour lesquelles je choisirais la purge. Tout d'abord, vous pouvez faire la purge hg - imprimer et voir une liste de ce qui va se débarrasser avant de faire la purge. Deuxièmement, si vous le faites de cette façon, vous devez être à la racine du référentiel pour que cela fonctionne.
Yaakov Kuperman
1
@javawizard: C'est une bonne idée qui m'a fait repenser le fonctionnement de hg. Cependant, cela ne fonctionne que parce qu'il rm -rf *ignore les fichiers dot et les répertoires dot, y compris .hg/. De la même manière, tout autre fichier dot (par exemple .evil-settings) survivra également et la purge est meilleure.
dirkjot
2
Sachez qu'il existe une différence de comportement entre ce que «hg st -u» et «hg purge» trouvent. 'hg st -u' NE trouvera PAS les répertoires vides non suivis, tandis que 'hg purge' LES trouvera (et les supprimera). Cela peut ou non être important pour vous.
Michael Kent
19

Merci! Cela a également fonctionné pour moi à Powershell:

hg st -un | rm
Nikolaos Georgiou
la source
2
xargs ne fonctionne pas en PowerShell - c'est la seule réponse qui est prête à l'emploi "compatible Windows"
Nikos Athanasiou
d'accord ... deuxième sur les xargs ne fonctionnant pas dans le powershell ... la purge est toujours une option viable, cependant
beauXjames
A travaillé pour moi :)
Naveen Kumar V
4
rm $(hg st -u)

... où -u signifie "non suivi", vous pouvez également choisir un autre état.

Alex
la source
4

Vous pouvez utiliser

hg purge --all

pour supprimer tous les fichiers ignorés et non suivis

(vous devez d'abord installer l'extension de purge comme expliqué dans certaines réponses)

Alex L
la source
3

Essayez de suivre:

hg st -un | xargs rm
Alexei Tenitski
la source
2

Cela devrait faire l'affaire:

hg status | grep '^\?' | sed 's/^\? //' | xargs rm -rf
Kristian
la source
2

si vous ne souhaitez pas utiliser la purge:

rm $(hg st | grep ^? | awk '{print $2}')
Lev
la source
0

En supposant que vous utilisez un système * nix, vous pouvez exécuter quelque chose comme ceci:

rm `hg st | awk '/\?/ {print $2}'`

à partir de la racine du référentiel mercurial.

Je ne connais pas de commande mercurielle standard pour obtenir le même résultat, mais je pense qu'il existe de nombreuses autres options en ligne de commande pour ce faire. Je suis sûr qu'il existe de "meilleures" solutions et je serais intéressé à entendre d'autres suggestions.

Veuillez utiliser cette commande avec prudence car elle n'a pas été minutieusement testée.

Filtre Heinrich
la source
0

Cela fonctionne à partir de la ligne de commande de Windows 10 (utilisée avec prudence bien sûr):

for /f %g in ('hg status -un') do @echo %g & @del %g
Dave Cousineau
la source