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?
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?
(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).
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.
Führen Sie die folgenden Schritte für eine Datei/einen Ordner aus:
Eine Datei entfernen:
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:
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
Aktualisieren Sie Ihr .gitignore
Datei - fügen Sie zum Beispiel einen Ordner, den Sie nicht verfolgen wollen, zu .gitignore
.
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.
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.
Führen Sie die folgenden Schritte nacheinander aus, und Sie werden keine Probleme haben.
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 .)
Fügen Sie die Dateien/Verzeichnisse in den Ordner .gitignore Datei und speichern Sie sie.
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
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
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 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.