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.

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= 

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

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

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.


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.)



2

Dies sollte den Trick tun:

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

2

Wenn Sie Purge nicht verwenden möchten:

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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.