In diesem Abschnitt werden wir uns auf eine detaillierte Diskussion des Befehls git clean
konzentrieren. Git clean
ist in gewisser Weise ein „Rückgängig“-Befehl. Git clean
kann als Ergänzung zu anderen Befehlen wie git reset
und git checkout
betrachtet werden. Während diese anderen Befehle auf Dateien wirken, die zuvor in den Git-Verfolgungsindex aufgenommen wurden, wirkt der Befehl git clean
auf nicht verfolgte Dateien ein. Ungetrackte Dateien sind Dateien, die im Arbeitsverzeichnis Ihres Projektarchivs erstellt wurden, aber noch nicht mit dem Befehl git add
in den Tracking-Index des Projektarchivs aufgenommen wurden. Um den Unterschied zwischen verfolgten und nicht verfolgten Dateien zu verdeutlichen, betrachten Sie das folgende Befehlszeilenbeispiel:
$ mkdir git_clean_test $ cd git_clean_test/ $ git init . Initialized empty Git repository in /Users/kev/code/git_clean_test/.git/ $ echo "tracked" > ./tracked_file $ git add ./tracked_file $ echo "untracked" > ./untracked_file $ mkdir ./untracked_dir && touch ./untracked_dir/file $ git status On branch master Initial commit Changes to be committed: (use "git rm --cached ..." to unstage) new file: tracked_file Untracked files: (use "git add ..." to include in what will be committed) untracked_dir/ untracked_file
Das Beispiel erstellt ein neues Git-Repository im Verzeichnis git_clean_test
. Anschließend wird ein tracked_file
erstellt, das dem Git-Index hinzugefügt wird, außerdem wird ein untracked_file
erstellt und ein untracked_dir
. Das Beispiel ruft dann git status
auf, das den internen Status von Git mit verfolgten und nicht verfolgten Änderungen anzeigt. In diesem Zustand des Repositorys können wir den Befehl git clean
ausführen, um seinen Zweck zu demonstrieren.
$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean
An dieser Stelle kann die Ausführung des Standardbefehls git clean
einen schwerwiegenden Fehler verursachen. Das obige Beispiel zeigt, wie dies aussehen kann. Git ist standardmäßig so konfiguriert, dass git clean
mit der Option „force“ gestartet werden muss. Dies ist ein wichtiger Sicherheitsmechanismus. Wenn git clean
endgültig ausgeführt wird, kann dies nicht rückgängig gemacht werden. Wenn git clean
vollständig ausgeführt wird, wird eine harte Löschung des Dateisystems vorgenommen, ähnlich wie bei der Ausführung des Befehlszeilenprogramms rm. Vergewissern Sie sich, dass Sie die nicht verfolgten Dateien wirklich löschen wollen, bevor Sie es ausführen.
Allgemeine Optionen und Verwendung
Nach der vorangegangenen Erläuterung des Standardverhaltens von git clean
und der Vorbehalte werden im Folgenden verschiedene Anwendungsfälle von git clean
und die zugehörigen Befehlszeilenoptionen, die für ihre Ausführung erforderlich sind, demonstriert.
-n
Die Option -n
führt einen „Trockenlauf“ von git clean
durch. Dies zeigt Ihnen, welche Dateien entfernt werden sollen, ohne dass sie tatsächlich entfernt werden. Es ist empfehlenswert, immer zuerst einen Trockenlauf von git clean
durchzuführen. Wir können diese Option in dem zuvor erstellten Demo-Repository demonstrieren.
$ git clean -n Would remove untracked_file
Die Ausgabe zeigt uns, dass untracked_file
entfernt wird, wenn der Befehl git clean
ausgeführt wird. Beachten Sie, dass untracked_dir
in der Ausgabe nicht aufgeführt ist. Standardmäßig wird git clean
nicht rekursiv auf Verzeichnisse wirken. Dies ist ein weiterer Sicherheitsmechanismus, um ein versehentliches dauerhaftes Löschen zu verhindern.
-f or --force
Die Option force leitet das tatsächliche Löschen von nicht verfolgten Dateien aus dem aktuellen Verzeichnis ein. Force ist erforderlich, wenn die Konfigurationsoption clean.requireForce
nicht auf false gesetzt ist. Nicht verfolgte Ordner oder Dateien, die mit .gitignore
angegeben wurden, werden nicht entfernt. Führen wir nun einen Live git clean
in unserem Beispiel-Repo aus.
$ git clean -f Removing untracked_file
Der Befehl gibt die entfernten Dateien aus. Sie können hier sehen, dass untracked_file
entfernt wurde. Die Ausführung von git status
an dieser Stelle oder ein ls
zeigt, dass untracked_file
gelöscht wurde und nirgendwo mehr zu finden ist. Standardmäßig wirkt git clean -f
auf alle nicht verfolgten Dateien im aktuellen Verzeichnis. Zusätzlich kann mit der Option -f
ein Wert übergeben werden, der eine bestimmte Datei entfernt.
git clean -f -d include directories
Die Option -d
teilt git clean
mit, dass auch alle nicht verfolgten Verzeichnisse entfernt werden sollen, standardmäßig werden Verzeichnisse ignoriert. Wir können die Option -d
zu unseren vorherigen Beispielen hinzufügen:
$ git clean -dn Would remove untracked_dir/ $ git clean -df Removing untracked_dir/
Hier haben wir einen „Trockenlauf“ mit der Kombination -dn
durchgeführt, der ausgibt, dass untracked_dir
entfernt werden soll. Dann führen wir eine erzwungene Bereinigung aus und erhalten die Ausgabe, dass untracked_dir
entfernt wurde.
-x force removal of ignored files
Ein gängiges Muster für die Veröffentlichung von Software ist ein Build- oder Distributionsverzeichnis, das nicht in den Tracking-Index der Repositories aufgenommen wird. Das Build-Verzeichnis enthält ephemere Build-Artefakte, die aus dem übergebenen Quellcode erzeugt werden. Dieses Build-Verzeichnis wird normalerweise der Datei repositories .gitignore
hinzugefügt. Es kann sinnvoll sein, dieses Verzeichnis auch mit anderen nicht getrackten Dateien zu bereinigen. Die Option -x
weist git clean
an, auch alle ignorierten Dateien einzuschließen. Wie bei früheren Aufrufen von git clean
empfiehlt es sich, vor dem endgültigen Löschen zunächst einen „Trockenlauf“ durchzuführen. Die Option -x
wirkt sich auf alle ignorierten Dateien aus, nicht nur auf projektspezifische Dateien. Dies könnte unbeabsichtigte Dinge wie ./.idea IDE-Konfigurationsdateien sein.
git clean -xf
Wie die Option -d
kann -x
mit anderen Optionen übergeben und kombiniert werden. In diesem Beispiel wird eine Kombination mit -f
demonstriert, die nicht verfolgte Dateien aus dem aktuellen Verzeichnis sowie alle Dateien, die Git normalerweise ignoriert, entfernt.
Interaktiver Modus oder git clean interactive
Zusätzlich zur Ad-hoc-Befehlszeilenausführung, die wir bisher demonstriert haben, verfügt git clean
über einen „interaktiven“ Modus, den Sie durch Übergabe der Option -i
einleiten können. Lassen Sie uns noch einmal das Beispiel-Repository aus der Einleitung dieses Dokuments betrachten. In diesem Ausgangszustand starten wir eine interaktive, saubere Sitzung.
$ git clean -di Would remove the following items: untracked_dir/ untracked_file *** Commands *** 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help What now>
Wir haben die interaktive Sitzung mit der Option -d
gestartet, so dass sie auch auf unser untracked_dir
wirkt. Im interaktiven Modus wird eine What now>
-Eingabeaufforderung angezeigt, die einen Befehl zur Anwendung auf die nicht verfolgten Dateien verlangt. Die Befehle selbst sind ziemlich selbsterklärend. Wir sehen sie uns kurz in zufälliger Reihenfolge an und beginnen mit dem Befehl 6: help
. Wenn Sie den Befehl 6 wählen, werden die anderen Befehle näher erläutert:
What now> 6 clean - start cleaning filter by pattern - exclude items from deletion select by numbers - select items to be deleted by numbers ask each - confirm each deletion (like "rm -i") quit - stop cleaning help - this screen ? - help for prompt selection
5: quit
Ist einfach und beendet die interaktive Sitzung.
1: clean
Löscht die angegebenen Elemente. Wenn wir an dieser Stelle 1: clean
ausführen würden, würde untracked_dir/ untracked_file
entfernt werden.
4: ask each
Wird jede nicht verfolgte Datei durchlaufen und eine Y/N
Aufforderung zum Löschen anzeigen. Es sieht wie folgt aus:
*** Commands *** 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help What now> 4 Remove untracked_dir/ ? N Remove untracked_file ? N
2: filter by pattern
Es wird eine zusätzliche Eingabeaufforderung angezeigt, die Eingaben entgegennimmt, mit denen die Liste der nicht verfolgten Dateien gefiltert wird.
Would remove the following items: untracked_dir/ untracked_file *** Commands *** 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help What now> 2 untracked_dir/ untracked_file Input ignore patterns>> *_file untracked_dir/
Hier geben wir das Platzhaltermuster *_file
ein, das die Liste der nicht verfolgten Dateien auf untracked_dir
einschränkt.
3: select by numbers
Ähnlich wie bei Befehl 2 wird mit Befehl 3 die Liste der nicht verfolgten Dateinamen verfeinert. Die interaktive Sitzung fragt nach Zahlen, die einem nicht verfolgten Dateinamen entsprechen.
Would remove the following items: untracked_dir/ untracked_file *** Commands *** 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help What now> 3 1: untracked_dir/ 2: untracked_file Select items to delete>> 2 1: untracked_dir/ * 2: untracked_file Select items to delete>> Would remove the following item: untracked_file *** Commands *** 1: clean 2: filter by pattern 3: select by numbers 4: ask each 5: quit 6: help
Zusammenfassung
Zusammenfassend lässt sich sagen, dass git clean
eine bequeme Methode ist, um nicht verfolgte Dateien im Arbeitsverzeichnis eines Repos zu löschen. Unverfolgte Dateien sind solche, die sich im Verzeichnis des Repos befinden, aber noch nicht mit git add
in den Index des Repos aufgenommen wurden. Insgesamt kann der Effekt von git clean
mit git status
und den systemeigenen Löschwerkzeugen erreicht werden. Git clean
kann zusammen mit git reset
verwendet werden, um alle Hinzufügungen und Übertragungen in einem Repository vollständig rückgängig zu machen.