Wie entferne ich eine Datei aus dem Git-Verlauf?

80

Vor einiger Zeit habe ich Informationen (Dateien) hinzugefügt, die privat sein müssen. Das Entfernen aus dem Projekt ist kein Problem, aber ich muss es auch aus dem gitVerlauf entfernen .

Ich benutze Git und Github (privater Account).

Hinweis: In diesem Thread wird etwas Ähnliches angezeigt, aber hier ist eine alte Datei, die einem Feature-Zweig hinzugefügt wurde. Dieser Zweig wurde zu einem Entwicklungszweig zusammengeführt und schließlich zum Master zusammengeführt, da hier viele Änderungen vorgenommen wurden. Es ist also nicht dasselbe und es ist erforderlich, den Verlauf zu ändern und diese Dateien aus Datenschutzgründen auszublenden.

Marcos R. Guevara
quelle
3
Sie müssten die Geschichte neu schreiben. Zum Beispiel git rebasedanngit push -f
Cory Kramer
Die filter-branchim vorgeschlagenen Duplikat beschriebene Methode macht das, was Sie wollen.
1615903
Auch stackoverflow.com/a/17890278, das auf die BFG verweist, die schneller sein kann als die Verwendunggit filter-branch
Hasturkun
Aber gehen Sie einfach schneller und machen Sie dasselbe und müssen Sie Java verwenden. Ich lese @Hasturkun
Marcos R. Guevara

Antworten:

94

Ich habe diese Antwort gefunden und es hat geholfen:

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch path_to_file" HEAD

Fand es hier https://myopswork.com/how-remove-files-completely-from-git-repository-history-47ed3e0c4c35

Petro Franko
quelle
4
Warnung: Dies führt zu einer Menge Commits und zu Abweichungen. Sie müssen wahrscheinlich Druck nach erzwingen, aber ich hatte zu viel Angst.
Sudo
Ich stimme dem zu, was @sudo gesagt hat, aber das hat für meine neue Niederlassung funktioniert, für die ich mich versehentlich entschieden habe .env. Schnelle und präzise Lösung.
Joe Scotto
1
In der Tat funktioniert ein einfacher Kraftstoß! Ich hatte auch Angst, aber alles gesichert.
wutBruh
46

Wenn Sie diese Datei kürzlich festgeschrieben haben oder wenn sich diese Datei in ein oder zwei Festschreibungen geändert hat, würde ich vorschlagen , dass Sie diese bestimmte Festschreibung verwenden rebaseund cherrypickentfernen.

Andernfalls müssten Sie den gesamten Verlauf neu schreiben.

git filter-branch --tree-filter 'rm -f <path_to_file>' HEAD

Wenn Sie mit den Änderungen zufrieden sind und ordnungsgemäß sichergestellt haben, dass alles in Ordnung zu sein scheint, müssen Sie alle Remote-Zweige aktualisieren.

git push origin --force --all

Hinweis: - Es ist eine komplexe Operation, und Sie müssen wissen, was Sie tun. Versuchen Sie es zunächst in einem Demo-Repository, um zu sehen, wie es funktioniert. Sie müssen auch andere Entwickler darüber informieren, damit sie in der Zwischenzeit keine Änderungen vornehmen.

hspandher
quelle
Was muss nach dem Umschreiben des gesamten Verlaufs getan werden, um die Änderungen am Repository (Github) beizubehalten?
Marcos R. Guevara
Vielen Dank, ich werde warten, um es zu tun, und es mit einem Demo-Repository versuchen, ich werde mit allem aktualisieren, was hier getan wurde.
Marcos R. Guevara
Aus Versehen habe ich vergessen hinzuzufügen --all. Jetzt heißt es immer auf dem neuesten Stand, wenn ich mit beiden Argumenten erneut drücke. Und die Datei wird nicht aus anderen Zweigen entfernt. Was sollte ich jetzt tun?
Reeshabh Ranjan
Warum wird Ihr Vorschlag in der Antwort von @ PetroFranko --tree-filtereher verwendet als --index-filterwie?
Einpoklum
11
  • Entfernen Sie die Datei und schreiben Sie den Verlauf aus dem Commit neu, den Sie mit der entfernten Datei durchgeführt haben (dadurch wird ein neuer Commit-Hash aus der von Ihnen festgeschriebenen Datei erstellt):

    git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA' --prune-empty --tag-name-filter cat -- --all

  • Jetzt das Repo erzwingen:

    git push origin --force --all

  • Sagen Sie es jetzt Ihren Mitarbeitern rebase.

suhailvs
quelle
7

Die Verwendung des bfg Repo-Cleaner- Pakets ist eine weitere praktikable Alternative zu git-filter-branch. Anscheinend ist es auch schneller ...

c1au61o_HH
quelle
6

Ich habe diesen GitHub-Artikel gelesen , der mich zu folgendem Befehl führte (ähnlich der akzeptierten Antwort, aber etwas robuster):

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" --prune-empty --tag-name-filter cat -- --all
Vancy-Pants
quelle
5
  • Fügen Sie es zunächst Ihrer .gitignoreDatei hinzu und vergessen Sie nicht, die Datei festzuschreiben :-)
  • Sie können diese Site verwenden: http://gtiignore.io , um das .gitignorefür Sie zu generieren und den erforderlichen Pfad zu Ihren Binärdateien / Ordnern hinzuzufügen.

  • Sobald Sie die Datei hinzugefügt haben, können .gitignoreSie die "alte" Binärdatei mit BFG entfernen.


How to remove big files from the repository

Sie können git filter-branchoder BFG verwenden. https://rtyley.github.io/bfg-repo-cleaner/

BFG Repo-Cleaner

eine Alternative zu Git-Filter-Branch.

Die BFG ist eine einfachere und schnellere Alternative zum Git-Filter-Zweig, um fehlerhafte Daten aus Ihrem Git-Repository-Verlauf zu entfernen:

* Entfernen verrückter großer Dateien *
* Entfernen von Passwörtern, Anmeldeinformationen und anderen privaten Daten

Beispiele (von der offiziellen Seite)

In all diesen Beispielen ist bfg ein Alias ​​für java -jar bfg.jar.

# Delete all files named 'id_rsa' or 'id_dsa' :
bfg --delete-files id_{dsa,rsa}  my-repo.git

Geben Sie hier die Bildbeschreibung ein

CodeWizard
quelle
2

Git-Repo-Filter

gitempfiehlt die Verwendung von git-filter-repo (wenn der git filter-branchBefehl ausgeführt wird). Es gibt eine lange Liste, warum es besser ist als alle anderen Alternativen ( https://github.com/newren/git-filter-repo#why-filter-repo-instead-of-other-alternatives ). Meine Erfahrung ist dies es ist sehr einfach und sehr schnell.

Dieser Befehl entfernt die Datei aus allen Commits in allen Zweigen:

git filter-repo --path <path to the file or directory> --invert-paths

Mithilfe mehrerer --pathParameter können mehrere Pfade angegeben werden. Eine ausführliche Dokumentation finden Sie hier: https://www.mankier.com/1/git-filter-repo

Tibor Takács
quelle