Wie lösche ich alle nicht verfolgten Dateien aus meinem Arbeitsverzeichnis in Mercurial?

207

Ist es möglich, alle nicht verfolgten Dateien aus meinem Arbeitsverzeichnis zu löschen? Nehmen wir an, ich habe meinem Arbeitsverzeichnis eine Reihe von Dateien hinzugefügt, sie nicht über 'hg add' hinzugefügt und möchte diese neuen Dateien nun vollständig entfernen?

Ich arbeite unter Windows, obwohl ich PowerShell verwende, sodass hier auch eine kombinierte Lösung möglich ist.

Valentin Vasilyev
quelle

Antworten:

286

Fügen Sie die Mercurial Extension hinzu, die als Purge bezeichnet wird . Es wird von Mercurial vertrieben.

Diese Erweiterung fügt "hg" den Befehl "purge" hinzu, mit dem Dateien entfernt werden, die Mercurial nicht bekannt sind. dh nicht verfolgte Dateien. Ihr Befehl wäre also:

hg purge

Es ist standardmäßig nicht aktiviert, um zu vermeiden, dass versehentlich Dateien entfernt werden, die Sie vergessen haben, hinzuzufügen.

Um diese Erweiterung zu installieren, fügen Sie diese Ihrer Mercurial-Einstellungsdatei hinzu (.hgrc unter Unix, Mercurial.ini unter Windows).

[extensions]
purge = 

Um diese Erweiterung vorübergehend zu aktivieren, können Sie verwenden

hg purge --config extensions.purge= 
einfach hart
quelle
26
hg purge --alllöscht alle nicht verfolgten und ignorierten Dateien. Dies ist nützlich für die Bereinigung von In-Source-Builds
Tacaswell
22
um die ext vorübergehend zu aktivieren, können Sie verwendenhg purge --config extensions.purge=
Pykler
121

Der richtige Weg ohne Säuberung ist:

hg st -un0 | xargs -0 rm
Tonfa
quelle
1
@simplyharsh ist auf diese Weise besser oder fanden Sie es einfach weniger Arbeit als das Hinzufügen der Erweiterung?
Yaakov Kuperman
3
@YaakovKuperman Ich denke, das Hinzufügen einer Erweiterung ist weniger Arbeit als dieser Befehl (einmaliges Aktivieren). Ich aktiviere die Bereinigungserweiterung nicht, da ich sie weniger als einmal in zwei Wochen benötige. Nennen Sie mich auch albern, aber wenn ich diesen Befehl tippe, habe ich genug Zeit, um noch einmal nachzudenken, bevor ich etwas so Deskriptives wie "Löschen" tue.
simplyharsh
2
@simplyharsh, das macht Sinn, aber es gibt zwei Gründe, warum ich mich trotzdem für eine Säuberung entscheiden würde. Zuerst können Sie hg purge --print ausführen und eine Liste anzeigen, was entfernt werden soll, bevor Sie die Bereinigung durchführen. Zweitens, wenn Sie es auf diese Weise tun, müssen Sie sich im Stammverzeichnis des Repos befinden, damit es funktioniert.
Yaakov Kuperman
1
@javawizard: Dies ist eine nette, die mich überdenken ließ, wie hg funktioniert. Dies funktioniert jedoch nur, weil rm -rf *Punktdateien und Punktverzeichnisse einschließlich übersprungen werden .hg/. Aus dem gleichen Grund überlebt auch jede andere Punktdatei (z. B. .evil-settings) und die Bereinigung ist besser.
Dirkjot
2
Beachten Sie, dass es einen Unterschied im Verhalten zwischen den Ergebnissen von 'hg st -u' und 'hg purge' gibt. 'hg st -u' findet KEINE nicht verfolgten leeren Verzeichnisse, während 'hg purge' sie findet (und entfernt). Das kann für Sie wichtig sein oder auch nicht.
Michael Kent
19

Vielen Dank! Das hat bei mir auch in Powershell funktioniert:

hg st -un | rm
Nikolaos Georgiou
quelle
2
xargs funktioniert nicht in Powershell - dies ist die einzige Antwort, die sofort "fensterfreundlich" ist
Nikos Athanasiou
vereinbart ... zweitens bei Xargs, die nicht in Powershell arbeiten ... Bereinigung ist jedoch immer noch eine praktikable Option
beauXjames
Arbeitete für mich :)
Naveen Kumar V
4
rm $(hg st -u)

... wo -u für "untracked" steht, können Sie auch einen anderen Status auswählen.

Alex
quelle
4

Sie können verwenden

hg purge --all

um alle ignorierten und nicht verfolgten Dateien zu entfernen

(Zuerst müssen Sie die Bereinigungserweiterung installieren, wie in einigen Antworten erläutert.)

Alex L.
quelle
3

Versuchen Sie Folgendes:

hg st -un | xargs rm
Alexei Tenitski
quelle
2

Dies sollte den Trick tun:

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

Wenn Sie Purge nicht verwenden möchten:

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

Angenommen, Sie verwenden ein * nix-System, könnten Sie Folgendes ausführen:

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

von der Wurzel des Quecksilber-Repository.

Ich kenne keinen Standard-Quecksilberbefehl, um dasselbe zu erreichen, aber ich glaube, es gibt viel mehr Befehlszeilenoptionen, um dies zu tun. Ich bin mir sicher, dass es "bessere" Lösungen gibt und würde mich über weitere Vorschläge freuen.

Bitte verwenden Sie diesen Befehl mit Vorsicht, da er nicht gründlich getestet wurde.

Heinrich Filter
quelle