Git rm – Übersicht

Anwendung

<file>…​

Gibt die zu entfernenden Zieldateien an. Der Optionswert kann eine einzelne Datei, eine mit Leerstellen getrennte Dateiliste file1 file2 file3 oder eine Wildcard-Dateiauswahl (~./directory/*) sein.

-f
--force

Die Option -f wird zur Umgehung der Sicherheitsprüfung verwendet, die Git durchführt, um sicherzustellen, dass die Dateien im HEAD zum aktuellen Inhalt des Staging-Index und des Arbeitsverzeichnisses passen.

-n
--dry-run

Die Option "dry run" ist ein Schutz, mit dem der Befehl git rm ausgeführt, die Dateien aber nicht tatsächlich gelöscht werden. Stattdessen wird ausgegeben, welche Dateien von der Entfernung betroffen wären.

-r

Die Option -r ist die Kurzversion von "recursive". Bei Betrieb im rekursiven Modus entfernt git rm ein Zielverzeichnis und den gesamten Inhalt dieses Verzeichnisses.

--

Die Trennoption wird verwendet, um ausdrücklich zwischen einer Liste von Dateinamen und den an git rm weitergegebenen Argumenten zu unterscheiden. Dies ist nützlich, wenn einige der Dateinamen eine Syntax aufweisen, die mit anderen Optionen verwechselt werden könnte.

--cached

Die Option cached gibt an, dass die Löschung nur im Staging-Index erfolgen soll. Die Dateien im Arbeitsverzeichnis werden nicht angerührt.

--ignore-unmatch

Diese Option führt dazu, dass der Befehl mit einem Sigterm-Status 0 beendet wird, selbst wenn keine passenden Dateien gefunden wurden. Dies ist ein Statuscode auf Unix-Ebene. Der Code 0 zeigt einen erfolgreichen Aufruf des Befehls an. Die Option --ignore-unmatch kann nützlich sein, wenn git rm als Teil eines größeren Shellskripts eingesetzt wird, das kontrolliert fehlschlagen muss.

-q
--quiet

Die Option "quiet" verbirgt die Ausgabe des Befehls git rm. Der Befehl gibt normalerweise eine Zeile für jede entfernte Datei aus.

So wird git rm rückgängig gemacht

Das Ausführen von git rm ist kein permanentes Update. Der Befehl aktualisiert den Staging-Index und das Arbeitsverzeichnis. Diese Änderungen werden erst dauerhaft übertragen, wenn ein neuer Commit erstellt und die Änderungen zum Commit-Verlauf hinzugefügt werden. Dies bedeutet, dass die hier durchgeführten Änderungen auch mit den normalen Git-Befehlen rückgängig gemacht werden können.

git reset HEAD

Ein Reset setzt den aktuellen Staging-Index und das Arbeitsverzeichnis wieder auf den HEAD Commit zurück. Dies macht ein git rm rückgängig.

git checkout .

Diskussion

Das an den Befehl weitergegebene <file>-Argument kann eine genaue Pfadangabe, Wildcard-Dateiauswahlmuster oder auch genaue Verzeichnisnamen enthalten. Der Befehl entfernt nur Pfade, die aktuell im Git-Repository committet sind.

Die Wildcard-Dateiauswahl ist in allen Verzeichnissen gleich. Man sollte bei der Verwendung von Wildcard-Auswahlen unbedingt vorsichtig sein. Sehen wir uns dazu ein Beispiel an: directory/* und directory*. Das erste Beispiel entfernt alle Unterverzeichnisse von directory/, während das zweite Beispiel alle gleichgeordneten Verzeichnisse wie directory1, directory2, directory_whatever entfernt, was ein unerwartetes Ergebnis sein kann.

Der Umfang von git rm

Der Befehl git rm wird nur auf dem aktuellen Branch ausgeführt. Das Entfernen wird nur auf das Arbeitsverzeichnis und die Staging-Indexbäume angewendet. Die Dateientfernung wird nicht in den Repository-Verlauf übertragen, bis ein neuer Commit erstellt wird.

Warum besser git rm anstatt rm verwenden

Ein Git-Repository erkennt, wenn ein normaler rm Befehl auf einer Datei ausgeführt wurde, die es verfolgt. Das Arbeitsverzeichnis wird aktualisiert, um die Entfernung zu veranschaulichen. Der Staging-Index wird aber nicht mit der Entfernung aktualisiert. Auf den entfernten Dateipfaden muss ein zusätzlicher git add-Befehl ausgeführt werden, um die Änderungen zum Staging-Index hinzuzufügen. Der Befehl git rm funktioniert wie ein Shortcut, da hier das Arbeitsverzeichnis und der Staging-Index mit der Entfernung aktualisiert werden.

Beispiele

git rm Documentation/\*.txt

In diesem Beispiel wird eine Wildcard-Dateiauswahl verwendet, um alle *.txt Dateien zu entfernen, die im Verzeichnis Documentation oder einem seiner Unterverzeichnisse liegen.

Beachte, dass das Sternchen * in diesem Beispiel mit Schrägstrichen beendet wird. Dadurch wird verhindert, dass in der Befehlsshell das Wildcard-Symbol erweitert wird. Die Wildcard erweitert dann die Verzeichnisnamen um Dateien und Unterverzeichnisse unterhalb des Verzeichnisses Documentation/.

git rm -f git-*.sh

In diesem Beispiel wird die Option "force" eingesetzt und es werden alle Wildcard-git-*.sh-Dateien angesprochen. Die Force-Option entfernt die Zieldateien explizit aus dem Arbeitsverzeichnis und dem Staging-Index.

So werden Dateien gelöscht, die nicht mehr im Dateisystem sind

Wie bereits oben in "Warum besser git rm anstatt rm verwenden" erklärt, ist git rm ein sehr praktischer Befehl, der die Standardshells rm und git add kombiniert, um eine Datei aus dem Arbeitsverzeichnis zu entfernen und diese Entfernung in den Staging-Index zu übertragen. Wenn mehrere Dateien nur mit dem einfachen Befehl rm entfernt werden, kann ein Repository schnell unhandlich werden.

Wenn alle explizit entfernten Dateien als Teil des nächsten Commits aufgezeichnet werden sollen, fügt git commit -a in Vorbereitung des nächsten Commits alle Entfernereignisse dem Staging-Index hinzu.

Falls jedoch die mit rm entfernten Dateien dauerhaft entfernt werden sollen, verwendest du den folgenden Befehl:

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached

Dieser Befehl erzeugt eine Liste der aus dem Arbeitsverzeichnis entfernten Dateien und leitet diese Liste an git rm --cached weiter, was dann den Staging-Index aktualisiert.