git rm
Eine häufige Frage bei der ersten Arbeit mit Git ist: "Wie kann ich Git sagen, dass eine Datei (oder mehrere Dateien) nicht mehr verfolgt werden sollen?". Der Befehl git rm
wird verwendet, um Dateien aus einem Git-Repository zu entfernen. Er kann als Gegenstück zum Befehl git add betrachtet werden.
Git rm – Übersicht
Der Befehl git rm
kann verwendet werden, um einzelne Dateien oder eine Gruppe von Dateien zu entfernen. Die primäre Funktion von git rm
ist die Entfernung der verfolgten Dateien aus dem Git-Index. Zusätzlich kann git rm
eingesetzt werden, um Dateien aus dem Staging-Index und dem Arbeitsverzeichnis zu entfernen. Es gibt keine Option, mit der eine Datei nur aus dem Arbeitsverzeichnis entfernt werden kann. Die Dateien, mit denen der Befehl arbeitet, müssen mit den Dateien im aktuellen HEAD
identisch sein. Falls es eine Diskrepanz zwischen der HEAD
-Version einer Datei und dem Staging-Index oder einer Arbeitsbaumversion gibt, blockiert Git das Entfernen. Dies ist eine Sicherheitsvorkehrung, um ein Entfernen von aktuell in Bearbeitung befindlicher Änderungen zu unterbinden.
Beachte, dass git rm
keine Branches entfernt. Weitere Informationen dazu findest du unter Verwenden von Git-Branches
Anwendung von "git rebase"
<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.
Zugehöriges Material
Git-Merkzettel
Lösung anzeigen
Git kennenlernen mit Bitbucket Cloud
-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 .
Ein Checkout hat denselben Effekt und stellt die letzte Version einer Datei aus dem HEAD
wieder her.
Für den Fall, dass git rm
ausgeführt und ein neuer Commit erstellt wurde, der die Löschung dauerhaft durchführt, kann git reflog
verwendet werden, um eine Referenz zu finden, die vor der Ausführung von git rm
lag. Weitere Informationen dazu findest du unter Verwenden von git reflog.
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.
Zusammenfassung zu Git rm
git rm
ist ein Befehl, der zwei der primären internen Statusmanagementbäume von Git bearbeitet: das Arbeitsverzeichnis und den Staging-Index. git rm
wird verwendet, um eine Datei aus einem Git-Repository zu entfernen. Dies ist eine praktische Methode, da die Ergebnisse der Standardshell rm
mit git add
kombiniert werden. Dies bedeutet, dass zuerst ein Ziel aus dem Dateisystem entfernt und dann das Entfernereignis zum Staging-Index hinzugefügt wird. Der Befehl ist einer von vielen, die eingesetzt werden können, um Änderungen in Git rückgängig zu machen.
Diesen Artikel teilen
Nächstes Thema
Lesenswert
Füge diese Ressourcen deinen Lesezeichen hinzu, um mehr über DevOps-Teams und fortlaufende Updates zu DevOps bei Atlassian zu erfahren.