8100 Stimmen

Wie kann ich Git dazu bringen, eine Datei zu "vergessen", die verfolgt wurde, aber jetzt in .gitignore ist?

Es gibt eine Datei, die von Git verfolgt wurde, aber jetzt ist die Datei in der .gitignore Liste.

Diese Datei taucht jedoch weiterhin in git status nachdem es bearbeitet wurde. Wie kann man Git zwingen, es komplett zu vergessen?

120voto

Joel Hooks Punkte 6209

Verschieben Sie es heraus, bestätigen Sie es und verschieben Sie es dann wieder hinein.

Das hat bei mir in der Vergangenheit funktioniert, aber es gibt wahrscheinlich einen "besseren" Weg, dies zu erreichen.

109voto

David H. Punkte 2722

Ich verwende diesen Befehl immer, um diese nicht verfolgten Dateien zu entfernen. Einzeilige, saubere Ausgabe im Unix-Stil:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

Es listet alle ignorierten Dateien auf, ersetzt jede Ausgabezeile durch eine Anführungszeichen-Zeile, um Pfade mit Leerzeichen darin zu behandeln, und übergibt alles an git rm -r --cached um die Pfade/Dateien/Verzeichnisse aus dem Index zu entfernen.

95voto

Dheeraj Bhaskar Punkte 17881

Verwenden Sie dies, wenn:

  1. Sie wollen viele Dateien aufspüren, oder
  2. Sie haben Ihre .gitignore Datei

出典 Aufheben der Verfolgung von bereits zum Git-Repository hinzugefügten Dateien auf der Grundlage von .gitignore

Nehmen wir an, Sie haben bereits einige Dateien zu Ihrem Git-Repository hinzugefügt/übertragen und fügen diese dann zu Ihrem .gitignore Datei; diese Dateien werden weiterhin in Ihrem Repository-Index vorhanden sein. In diesem Artikel werden wir sehen, wie man sie loswird.

Schritt 1: Bestätigen Sie alle Ihre Änderungen

Bevor Sie fortfahren, vergewissern Sie sich, dass alle Ihre Änderungen festgeschrieben sind, einschließlich Ihrer .gitignore Datei.

Schritt 2: Entfernen Sie alles aus dem Repository

Um Ihr Repository zu löschen, verwenden Sie:

git rm -r --cached .
  • rm ist der Befehl zum Entfernen
  • -r ermöglicht die rekursive Entfernung
  • -cached werden nur Dateien aus dem Index entfernt. Ihre Dateien sind weiterhin vorhanden.

El rm Das Kommando kann unversöhnlich sein. Wenn Sie vorher ausprobieren möchten, was er tut, fügen Sie die -n o --dry-run Flagge, um die Dinge zu testen.

Schritt 3: Alles lesen

git add .

Schritt 4: Zusage

git commit -m ".gitignore fix"

Ihr Repository ist sauber :)

Übertragen Sie die Änderungen auf Ihre Fernbedienung, damit die Änderungen auch dort wirksam werden.

74voto

Seth Robertson Punkte 29071

Wenn Sie nicht git rm eine verfolgte Datei, weil andere Leute sie brauchen könnten (Warnung, auch wenn Sie git rm --cached Wenn jemand anderes diese Änderung erhält, werden seine Dateien in seinem Dateisystem gelöscht). Dies geschieht häufig aufgrund von Überschreibungen der Konfigurationsdatei, Authentifizierungsdaten usw. Bitte sehen Sie sich https://gist.github.com/1423106 wie das Problem umgangen werden kann.

Zusammengefasst:

  • Lassen Sie Ihre Anwendung nach einer ignorierten Datei config-overide.ini suchen und diese anstelle der übergebenen Datei config.ini verwenden (oder suchen Sie alternativ nach ~/.config/myapp.ini oder $MYCONFIGFILE)
  • Übertragen Sie die Datei config-sample.ini und ignorieren Sie die Datei config.ini, lassen Sie ein Skript oder ähnliches die Datei bei Bedarf kopieren.
  • Versuchen Sie, gitattributes clean/smudge magic zu verwenden, um die Änderungen für Sie anzuwenden und zu entfernen, z. B. smudge die Konfigurationsdatei als Checkout aus einem alternativen Branch und clean die Konfigurationsdatei als Checkout aus HEAD. Das ist eine knifflige Angelegenheit, die ich Anfängern nicht empfehle.
  • Legen Sie die Konfigurationsdatei in einem eigenen Deploy-Zweig ab, der nie in den Master-Zweig eingebunden wird. Wenn Sie deployen/kompilieren/testen wollen, fügen Sie zu diesem Zweig zusammen und erhalten die Datei. Dies ist im Wesentlichen der smudge/clean-Ansatz, außer dass man menschliche Merge-Richtlinien und extra-git-Module verwendet.
  • Anti-Rekommentierung: Verwenden Sie nicht assume-unchanged, das wird nur in Tränen enden (denn wenn Git sich selbst belügt, werden schlimme Dinge passieren, wie z.B. dass Ihre Änderung für immer verloren geht).

65voto

drrlvn Punkte 7881

Ich habe dies erreicht, indem ich git filter-branch . Der genaue Befehl, den ich verwendet habe, stammt aus der Manpage:

WARNUNG : Damit wird die Datei aus dem gesamten Verlauf gelöscht.

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

Dieser Befehl erstellt die gesamte Commit-Historie neu, indem er git rm vor jeder Übertragung und wird so die angegebene Datei loswerden. Vergessen Sie nicht, die Datei zu sichern, bevor Sie den Befehl ausführen, da er wird verloren gehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X