3882 Stimmen

Entfernen einer Datei aus einem Git-Repository, ohne sie aus dem lokalen Dateisystem zu löschen

Mein erster Commit enthielt einige Protokolldateien. Ich habe hinzugefügt *log zu meinem .gitignore und jetzt möchte ich die Protokolldateien aus meinem Repository entfernen.

git rm mylogfile.log

entfernt eine Datei aus dem Repository, aber auch aus dem lokalen Dateisystem.

Wie kann ich diese Datei aus dem Repo entfernen? ohne meine lokale Kopie der Datei zu löschen?

54 Stimmen

Es ist erwähnenswert, dass die am meisten hochgestimmte Antwort für einige gefährlich ist. Wenn Sie ein entferntes Projektarchiv verwenden, dann ziehen Sie, wenn Sie Ihr lokales Projektarchiv pushen, nur die Dateien, die Sie aus Git entfernt haben, woanders hin WIRD GELÖSCHT . Dies wird in einer der Antworten erwähnt, aber nicht weiter kommentiert.

2 Stimmen

Um es auf die richtige Weise zu tun: stackoverflow.com/questions/57418769/

76voto

BoD Punkte 10481

Wenn Sie sensible Daten übertragen haben (z. B. eine Datei mit Passwörtern), sollten Sie diese vollständig aus der Historie des Repositorys löschen. Hier ist eine Anleitung, die erklärt, wie das geht: http://help.github.com/remove-sensitive-data/

29 Stimmen

Diese Antwort sollte die erforderlichen Befehle enthalten, um diese Aufgabe zu lösen, anstatt auf eine andere Website zu verweisen.

1 Stimmen

Ich möchte auch anmerken, dass ich die Verwendung des git bfg repo cleaner tool einfacher und schneller.

29voto

Rystraum Punkte 1875

Mit Git können Sie diese Dateien ignorieren, indem Sie annehmen, dass sie unverändert sind. Diese wird durch die Ausführung der git update-index --assume-unchanged path/to/file.txt Befehl. Sobald eine Datei als solche markiert ist, wird Git alle Änderungen an dieser Datei vollständig ignorieren; sie werden nicht angezeigt, wenn git status oder git diff angezeigt, noch werden sie jemals übertragen.

(De https://help.github.com/articles/ignoring-files )

Daher werden sie nicht gelöscht, sondern für immer ignoriert. Ich glaube, das funktioniert nur lokal, d. h. die Kollegen können die Änderungen immer noch sehen, wenn sie nicht denselben Befehl wie oben ausführen. (Das muss ich allerdings noch überprüfen.)

Hinweis: Dies ist keine direkte Antwort auf die Frage, sondern basiert auf Folgefragen in den Kommentaren der anderen Antworten.

4 Stimmen

Hm, ich mache das, aber ich sehe, dass die Datei überschrieben werden kann, wenn jemand anderes Änderungen an ihr im Repo vornimmt.

26voto

Afraz Ahmad Punkte 4658

Wenn Sie nur untrack eine Datei und nicht löschen aus dem lokalen und dem entfernten Repository, dann verwenden Sie diesen Befehl:

git update-index --assume-unchanged  file_name_with_path

11 Stimmen

Dies ist zwar eine gute Antwort, aber es ist wichtig zu beachten, dass damit eine Datei nicht in dem Sinne "enttrackt" wird, wie es bei Git üblich ist, denn eine enttrackte Datei ist eine Datei, die nicht in der Repository-Historie enthalten ist und auch nie enthalten war. Was diese Antwort bewirkt, ist, dass die Datei im Projektarchiv verbleibt, Git aber nicht merkt, dass daran Änderungen vorgenommen wurden. Das hat einige signifikante Unterschiede -- am wichtigsten ist, dass die Datei immer noch für andere vorhanden ist, und wenn jemand anderes Änderungen daran macht und Sie ziehen, kann Ihre lokale Kopie ohne Bestätigung überschrieben werden.

17voto

Michael Durrant Punkte 88734

Ignorieren Sie die Dateien, entfernen Sie die Dateien aus git, aktualisieren Sie git (für die Entfernung).

Hinweis: Dies gilt nicht für die Historie sensibler Informationen.

Dieser Prozess erfordert definitiv ein gewisses Verständnis dafür, was in Git vor sich geht. Mit der Zeit habe ich gelernt, Prozesse wie z. B.:

1) Ignorieren Sie die Dateien

  • Hinzufügen oder Aktualisieren des Projekts .gitignore zu ignorieren - in vielen Fällen wie dem Ihren ist das übergeordnete Verzeichnis, z. B. log/ wird die zu verwendende Regex sein.
  • Übertragen und Veröffentlichen der .gitignore Dateiänderung (ich bin nicht sicher, ob ein Push nötig ist, aber es schadet nicht, wenn er gemacht wird).

2) Entfernen Sie die Dateien aus git (nur).

  • Entfernen Sie nun die Dateien aus git (nur) mit git rm --cached some_dir/
  • Überprüfen Sie, ob sie noch vor Ort sind (das sollten sie!).

3) Hinzufügen und Übertragen der Änderung (dies ist im Wesentlichen eine Änderung zu "add", die etwas löscht, trotz des ansonsten verwirrenden Befehls "add"!)

  • git add .
  • git commit -m"removal"

0 Stimmen

Siehe diese Frage für Details, warum dies eine schlechte Antwort ist: stackoverflow.com/questions/57418769/

8voto

Martijn Mellens Punkte 522

Die obigen Antworten haben bei mir nicht funktioniert. Ich benutzte filter-branch um alle übergebenen Dateien zu entfernen.

Entfernen einer Datei aus einem Git-Repository mit:

git filter-branch --tree-filter 'rm  file'

Entfernen eines Ordners aus einem Git-Repository mit:

git filter-branch --tree-filter 'rm -rf directory'

Dadurch wird das Verzeichnis oder die Datei aus allen Übertragungen entfernt.

Sie können eine Übergabe angeben, indem Sie:

git filter-branch --tree-filter 'rm -rf directory' HEAD

Oder eine Reichweite:

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

Um alles in die Ferne zu verschieben, können Sie das tun:

git push origin master --force

2 Stimmen

Dies kombiniert mit git rm -r --cached NAME ist der Trick, um es aus dem lokalen Git-Repository zu entfernen und zu verhindern, dass es sich auf andere auswirkt, die später pullen (indem die Historie der Datei oder des Verzeichnisses aus Git gelöscht wird).

2 Stimmen

Dies schreibt die Git-Historie um, und Sie müssten danach --force pushen, aber das würde wohl den Rahmen der Frage sprengen. Bei einem öffentlich bekannten Repo kann man nicht einfach so die History-Zeile ändern, da jeder, der das Repo bereits geklont hat, beim Pulling Probleme bekommen würde.

0 Stimmen

Aus der Manpage "git filter-branch hat eine Fülle von Fallstricken .... Bitte verwenden Sie ein alternatives Werkzeug zum Filtern des Verlaufs, wie z. B. git filter-repo". Wenn Sie die Historie neu schreiben wollen, könnten Sie die ignore-Datei in einem frühen Stadium so ändern, dass die entfernten Elemente in der neuen Historie ignoriert werden.

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