.gitignore nach dem Festschreiben

210

Ich habe ein Git-Repository auf Github gehostet. Nachdem ich viele Dateien festgeschrieben habe, stelle ich fest, dass ich Dateien erstellen .gitignoreund ausschließen .exemuss .obj.

Werden diese festgeschriebenen Dateien jedoch automatisch aus dem Repository entfernt? Gibt es eine Möglichkeit, das zu erzwingen?

Madhur Ahuja
quelle
6
Zukünftige Googler finden dies möglicherweise äußerst nützlich. Kurz und bündig
Austin Dean

Antworten:

331

Nein, Sie können nicht erzwingen, dass eine bereits im Repo festgeschriebene Datei entfernt wird, nur weil sie dem hinzugefügt wurde .gitignore

Sie müssen git rm --cacheddie Dateien entfernen, die Sie nicht im Repo haben möchten. (--cached, da Sie wahrscheinlich die lokale Kopie behalten, aber aus dem Repo entfernen möchten.) Wenn Sie also alle Exes aus Ihrem Repo entfernen möchten, tun Sie dies

git rm --cached /\*.exe

(Beachten Sie, dass das Sternchen * aus der Shell zitiert wird. Dadurch kann git und nicht die Shell die Pfadnamen von Dateien und Unterverzeichnissen erweitern.)

Manojlds
quelle
6
@ Madhur Ahuja Wenn Sie dies tun git rm /\*.exe, werden alle
Exes
4
Wofür sind die / \?
Costa
5
@Costa Sie sind da, um dem Sternchen zu entkommen und zu verhindern, dass die Shell es so interpretiert, wie es vorgesehen ist git.
Lambart
2
Warnung: Die Dateien werden zwar lokal git pullgespeichert. Bei anderen Benutzern, die a ausführen, werden ihre Dateien jedoch gelöscht.
ByScripts
42

Werden diese festgeschriebenen Dateien jedoch automatisch aus dem Repository entfernt?

Nein. Selbst mit einer vorhandenen .gitignoreDatei können Sie "ignorierte" Dateien mit dem -fFlag (force) bereitstellen. Wenn die Dateien bereits festgeschrieben sind, werden sie nicht automatisch entfernt.

git rm --cached path/to/ignored.exe
KingCrunch
quelle
Bedeutet das, dass ich jede .exe einzeln entfernen muss
Madhur Ahuja
Sie sind wahrscheinlich in der Lage, dies zu
stapeln
30

Wenn Sie die Änderungen noch nicht vorgenommen haben:

git rm -r --cached .
git add .
git commit -m 'clear git cache'
git push
Slal
quelle
15

Ich musste .idea- und Zielordner entfernen und nachdem ich alle Kommentare gelesen hatte, funktionierte dies für mich:

git rm -r .idea
git rm -r target
git commit -m 'removed .idea folder'

und dann auf Master drücken

Emanuele
quelle
.ideawar mein Problem Ich denke, es war auch deins:)
Olivier Pons
5

Werden diese festgeschriebenen Dateien jedoch automatisch aus dem Repository entfernt?

Nein.

Das 'beste' Rezept dafür ist, git filter-branchwie hier beschrieben zu verwenden:

Die Manpage für Git-Filter-Branch enthält umfassende Beispiele.

Hinweis Sie schreiben den Verlauf neu. Wenn Sie Revisionen veröffentlicht haben, die die versehentlich hinzugefügten Dateien enthalten, kann dies zu Problemen für Benutzer dieser öffentlichen Zweige führen. Informieren Sie sie oder überlegen Sie, wie dringend Sie die Dateien entfernen müssen.

Hinweis Verwenden Sie bei Vorhandensein von Tags immer die --tag-name-filter catOption zu git filter-branch. Es tut nie weh und erspart Ihnen Kopfschmerzen, wenn Sie später feststellen, dass Sie es gebraucht haben

sehe sehen
quelle
Ich lief diesem Befehl zeigte Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) ACHTUNG: Ref 'refs / heads / master' ist unverändert und es ist nichts passiert
Madhur Ahuja
Dies ist eine Warnung und bedeutet höchstwahrscheinlich, dass der Hauptzweig (noch) keine Revisionen mit den zu entfernenden Dateien enthielt. Sie können das leicht überprüfen. Wenn es ein Problem gibt, aktualisieren Sie bitte die Frage. PS: Verwenden Sie - --allum alle (lokalen) Zweige gleichzeitig umzuschreiben
siehe
1

Auch nachdem Sie die Datei (en) gelöscht und dann festgeschrieben haben, bleiben diese Dateien im Verlauf. Um diese zu löschen, sollten Sie BFG Repo-Cleaner verwenden . Es ist eine Alternative zum Git-Filter-Zweig.

Asche
quelle