497 Stimmen

Entfernen des Ordners und seines Inhalts aus dem Verlauf von Git/GitHub

Ich habe an einem Repository auf meinem GitHub-Konto gearbeitet und bin über dieses Problem gestolpert.

  • Node.js-Projekt mit einem Ordner, in dem ein paar npm-Pakete installiert sind
  • Die Pakete waren in node_modules Ordner
  • Den Ordner zum Git-Repository hinzugefügt und den Code auf Github gepusht (zu diesem Zeitpunkt habe ich nicht an den npm-Teil gedacht)
  • Ich habe festgestellt, dass dieser Ordner nicht wirklich Teil des Codes sein muss.
  • Diesen Ordner gelöscht, verschoben

Zu diesem Zeitpunkt betrug die Größe des gesamten Git-Repositoriums etwa 6MB wo der eigentliche Code (alles außer diesem Ordner) nur etwa 300 KB .

Nun, was ich am Ende suche, ist ein Weg, um die Details dieses Paketordners aus der Git-Historie loszuwerden, so dass, wenn jemand es klont, sie nicht 6mb im Wert von Geschichte herunterladen müssen, wo die einzigen tatsächlichen Dateien, die sie ab der letzten Übertragung erhalten würden, 300KB sein würden.

Ich habe nach möglichen Lösungen für dieses Problem gesucht und diese 2 Methoden ausprobiert

Das Gist schien zu funktionieren, da es nach dem Ausführen des Skripts anzeigte, dass der Ordner gelöscht wurde und danach zeigte es an, dass 50 verschiedene Commits geändert wurden. Aber es ließ mich den Code nicht pushen. Als ich versuchte, ihn zu pushen, sagte es Branch up to date zeigte aber, dass 50 Übertragungen bei einer git status . Die anderen 2 Methoden haben auch nicht geholfen.

Obwohl es anzeigte, dass die Historie des Ordners gelöscht wurde, war die Größe des Repos auf meinem Localhost immer noch rund 6 MB groß. (Ich habe auch die refs/original aber die Größe des Projektarchivs hat sich nicht geändert).

Was ich zu klären suche, ist, ob es eine Möglichkeit gibt, nicht nur die Commit-Historie loszuwerden (was das Einzige ist, von dem ich glaube, dass es passiert ist), sondern auch die Dateien, die Git behält, wenn man ein Rollback machen will.

Sagen wir, eine Lösung für diese präsentiert wird und auf meinem localhost angewendet wird, aber kann nicht reproduziert werden, dass GitHub Repo, ist es möglich, dass Repo zu klonen, Rollback zum ersten Commit führen Sie den Trick und pushen Sie es (oder bedeutet das, dass Git noch eine Geschichte von all diesen Commits haben wird? - aka. 6MB).

Mein Endziel hier ist im Grunde den besten Weg zu finden, um den Ordnerinhalt von Git loszuwerden, so dass ein Benutzer nicht 6MB im Wert von Sachen herunterladen muss und immer noch möglicherweise die anderen Commits, die nie berührt den Ordner Module (das ist so ziemlich alle von ihnen) in Git Geschichte haben.

Wie kann ich das tun?

8voto

jgbarah Punkte 6466

Komplettes Copy&Paste-Rezept, ich füge nur die Befehle in den Kommentaren hinzu (für die Copy&Paste-Lösung), nachdem ich sie getestet habe:

git filter-branch --tree-filter 'rm -rf node_modules' --prune-empty HEAD
echo node_modules/ >> .gitignore
git add .gitignore
git commit -m 'Removing node_modules from git history'
git gc
git push origin master --force

Danach können Sie die Zeile "node_modules/" aus .gitignore entfernen

8voto

kcode Punkte 1200

Für Windows-Benutzer, beachten Sie bitte, dass Sie " anstelle von ' Außerdem hinzugefügt -f um den Befehl zu erzwingen, wenn bereits ein anderes Backup vorhanden ist.

git filter-branch -f --tree-filter "rm -rf FOLDERNAME" --prune-empty HEAD
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
echo FOLDERNAME/ >> .gitignore
git add .gitignore
git commit -m "Removing FOLDERNAME from git history"
git gc
git push origin master --force

2voto

LordObi Punkte 114

Ich habe die Ordner bin und obj aus alten C#-Projekten mit Git unter Windows entfernt. Seien Sie vorsichtig mit

git filter-branch --tree-filter "rm -rf bin" --prune-empty HEAD

Es zerstört die Integrität der Git-Installation, indem es den Ordner usr/bin im Git-Installationsordner löscht.

1voto

Iopheam Punkte 747

Für Kopiergeräte (von ici ):

git filter-repo --invert-paths --path PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA
echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore
git add .gitignore
git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore"
git push origin --force --all

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