Entfernen von Dateien aus einer Git Repository

Veröffentlich am 2019-05-07 by Malte

Immer wieder kommt es mal vor, das man bei der Arbeit mit einer Git Repository unbeabsichtigt Dateien in dieses Repository aufnimmt, die dort eigentlich nichts zu suchen haben. Sei es temporäre Dateien, wie zum Beispiel .DS_Store oder .~. Im späteren Verlauf ist es sehr ärgerlich diese Dateien wieder zu entfernen.

In diesem Beitrag möchte ich euch zeigen wir ihr diese Dateien aus der Repository entfernen könnt. Zwei Wege werde ich aufzeigen, einmal wo auch lokal diese Dateien entfernt werden und einmal wo die Dateien lokal bestehen bleiben.

Ausschließen von Dateien

In Git gibt es die Möglichkeiten bestimmte Dateien aus eine Repository auszuschließen. Dafür wurde von den Entwicklern von Git die Datei .gitignore geschaffen. In dieser einfach Textdatei kann man Zeilenweise Ordner, Dateien oder reguläre Ausdrücke aufnehmen um Dateien oder Ordner auszuschließen.

.DS_Store
*.~
...

Da es viele verschiedene Entwicklungsumgebungen und Programmiersprachen gibt und man nicht von allen die temporären Dateien kennen kann, haben sich einige Entwickler die Mühe gemacht, einen Generator für diese Datei zu entwickeln. Diese kann auf der folgenden Seite genutzt werden.

https://www.gitignore.io/

Entfernen von lokalen Dateien und Dateien in der Repository

Im folgenden gehe ich davon aus, dass ihr bereits eine .gitignore Datei angelegt habt. Diese wird jetzt benötigt um die entsprechenden Datei zu finden und zu löschen. Dazu könnt ihr den folgenden Befehl nutzen.

for f in $(cat .gitignore) ; do
  git rm -rf --ignore-unmatch "$f"
done && git add .gitignore && git commit -m "fix temp files" && git push origin master

Als Einzeiler

for f in $(cat .gitignore) ; do git rm -rf --ignore-unmatch "$f"; done && git add .gitignore && git commit -m "fix temp files" && git push origin master

Dieser Befehl findet alle diese Dateien nur, wenn diese bereits gestated wurden. Um die Datei zu finden und zu löschen bevor Sie gestated wurden muss der Befehl ein wenig angepasst werden:

for f in $(cat .gitignore) ; do
  rm -rf "$f"
done

Als Einzeiler

for f in $(cat .gitignore) ; do rm -rf "$f"; done

Bitte nur anwenden, wenn ihr wirklich wisst was ihr tut. Am besten vorher eine Sicherung anlegen

Entfernen Dateien in der Repository und behalten der lokalen Dateien

Als letztes gehen wir jetzt noch drauf ein, wie wir Dateien aus der Repository löschen aber die lokalen behalten. Dazu fügen wir nur eine kleine Option an den oberen Befehl an:

for f in $(cat .gitignore) ; do
  git rm -rf --cached --ignore-unmatch "$f"
done && git add .gitignore && git commit -m "fix temp files" && git push origin master

Als Einzeiler

for f in $(cat .gitignore) ; do git rm -rf --cached --ignore-unmatch "$f"; done && git add .gitignore && git commit -m "fix temp files" && git push origin master

Die Option --cached verhindert das Löschen der lokalen Dateien.

Und das war es auch schon. Jetzt sind wieder nur die wirklich wichtigen Dateien in unsere Repository.