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?

56voto

JonBrave Punkte 3519

Was bei mir nicht funktioniert hat

(unter Linux), wollte ich die Beiträge hier verwenden, die die ls-files --ignored --exclude-standard | xargs git rm -r --cached Ansatz. Allerdings hatten (einige) der zu entfernenden Dateien eine eingebettete Newline/LF/ \n in ihren Namen. Weder die eine noch die andere Lösung:

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

mit dieser Situation zurechtkommen (Fehlermeldung über nicht gefundene Dateien).

Deshalb biete ich

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached
git commit -am "Remove ignored files"

Dabei wird die -z Argument zu ls-files y el -0 Argument zu xargs um "unangenehme" Zeichen in Dateinamen sicher/korrekt zu behandeln.

Auf der Handbuchseite git-ls-files(1) heißt es dort:

Wenn die Option -z nicht verwendet wird, werden TAB-, LF- und Backslash-Zeichen in Pfadnamen werden wie folgt dargestellt \t , \n y \\ .

Ich denke also, dass meine Lösung erforderlich ist, wenn Dateinamen eines dieser Zeichen enthalten.

42voto

Arslan Ahmad khan Punkte 4616

Führen Sie die folgenden Schritte für eine Datei/einen Ordner aus:

Eine Datei entfernen:

  1. Sie müssen diese Datei zu .gitignore hinzufügen.
  2. müssen Sie diese Datei mit dem Befehl ( git rm --cached file name ).
  3. laufen müssen ( git add . ).
  4. müssen ( Übertragen -m ) "Datei entfernt".
  5. und schließlich, ( Git-Push ).

Zum Beispiel:

Ich möchte die test.txt Datei. Ich habe sie versehentlich auf GitHub veröffentlicht und möchte sie entfernen. Die Befehle lauten wie folgt:

Fügen Sie zunächst "test.txt" in die Datei .gitignore

git rm --cached test.txt
git add .
git commit -m "test.txt removed"
git push

Ordner entfernen:

  1. diesen Ordner zur Datei hinzufügen müssen .gitignore .
  2. müssen Sie diesen Ordner mit dem Befehl ( git rm -r --cached folder name ).
  3. laufen müssen ( git add . ).
  4. müssen ( Übertragen -m ) "Ordner entfernt".
  5. und schließlich, ( Git-Push ).

Zum Beispiel:

Ich möchte die .idee Ordner/Verzeichnis. Ich habe es versehentlich auf GitHub veröffentlicht und möchte es entfernen. Die Befehle lauten wie folgt:

Erstens, fügen Sie .idee im Ordner .gitignore

git rm -r --cached .idea
git add .
git commit -m ".idea removed"
git push

33voto

Chen_Wayne Punkte 533
  1. Aktualisieren Sie Ihr .gitignore Datei - fügen Sie zum Beispiel einen Ordner, den Sie nicht verfolgen wollen, zu .gitignore .

  2. git rm -r --cached . - Entfernen Sie alle verfolgten Dateien, einschließlich erwünschter und unerwünschter. Ihr Code wird sicher sein, solange Sie ihn lokal gespeichert haben.

  3. git add . - Alle Dateien werden wieder eingefügt, mit Ausnahme der Dateien in .gitignore .


Hut ab vor @AkiraYamamoto, der uns die richtige Richtung gezeigt hat.

25voto

Führen Sie die folgenden Schritte nacheinander aus, und Sie werden keine Probleme haben.

  1. entfernen die irrtümlich hinzugefügten Dateien aus dem Verzeichnis/Ablage . Sie können den Befehl "rm -r" (für Linux) verwenden oder sie löschen, indem Sie die Verzeichnisse durchsuchen. Oder verschieben Sie sie an einen anderen Ort auf Ihrem PC. (Möglicherweise müssen Sie die IDE schließen, wenn sie für Umziehen/Umzugsarbeiten .)

  2. Fügen Sie die Dateien/Verzeichnisse in den Ordner .gitignore Datei und speichern Sie sie.

  3. Ahora entfernen sie von der Git-Cache mit den folgenden Befehlen (wenn es mehrere Verzeichnisse gibt, entfernen Sie sie nacheinander durch wiederholtes Ausführen dieses Befehls)

     git rm -r --cached path-to-those-files
  4. Ahora tun a Commit und Push mit Hilfe der folgenden Befehle. Dies wird diese Dateien aus Git remote entfernen und machen Git Stop-Tracking diese Dateien.

     git add .
     git commit -m "removed unnecessary files from Git"
     git push origin

20voto

Boolean_Type Punkte 1063

Ich denke, dass Git eine Datei vielleicht nicht ganz vergessen kann, weil sie so konzipiert ist ( Abschnitt "Schnappschüsse, nicht Differenzen" ).

Dieses Problem tritt zum Beispiel nicht auf, wenn man CVS . CVS speichert Informationen in Form einer Liste von dateibasierten Änderungen. Informationen für CVS sind eine Reihe von Dateien und die Änderungen, die an jeder Datei im Laufe der Zeit vorgenommen wurden.

Aber in Git wird jedes Mal, wenn Sie einen Commit durchführen oder den Status Ihres Projekts speichern, ein Bild von dem gemacht, was alle Ihre Dateien aussieht, und speichert einen Verweis auf diesen Schnappschuss. Wenn Sie also eine Datei einmal hinzugefügt haben, wird sie immer in diesem Schnappschuss vorhanden sein.

Diese beiden Artikel waren für mich sehr hilfreich:

git assume-unchanged vs skip-worktree y Wie man mit Git Änderungen in verfolgten Dateien ignoriert

Darauf aufbauend mache ich folgendes, wenn die Datei bereits verfolgt wird:

git update-index --skip-worktree <file>

Von diesem Moment an werden alle lokalen Änderungen in dieser Datei ignoriert und nicht mehr an die Gegenstelle weitergeleitet. Wenn die Datei auf der Gegenstelle geändert wird, tritt ein Konflikt auf, wenn git pull . Stash wird nicht funktionieren. Um das Problem zu lösen, Kopieren Sie den Inhalt der Datei an einen sicheren Ort und befolgen Sie diese Schritte:

git update-index --no-skip-worktree <file>
git stash
git pull

Der Inhalt der Datei wird durch den entfernten Inhalt ersetzt. Fügen Sie Ihre Änderungen vom sicheren Ort in die Datei ein und führen Sie sie erneut aus:

git update-index --skip-worktree <file>

Wenn jeder, der an dem Projekt arbeitet, die git update-index --skip-worktree <file> Probleme mit pull sollte nicht vorhanden sein. Diese Lösung ist für Konfigurationsdateien in Ordnung, wenn jeder Entwickler seine eigene Projektkonfiguration hat.

Es ist nicht sehr bequem, dies jedes Mal zu tun, wenn die Datei auf dem entfernten Rechner geändert wurde, aber es kann sie vor dem Überschreiben durch entfernte Inhalte schützen.

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