Ich habe an einem Repository in meinem GitHub-Konto gearbeitet und auf dieses Problem bin ich gestoßen.
- Node.js-Projekt mit einem Ordner, in dem einige npm-Pakete installiert sind
- Die Pakete befanden sich im
node_modules
Ordner - Fügte diesen Ordner zum Git-Repository hinzu und schob den Code zu Github (dachte zu diesem Zeitpunkt nicht an den npm-Teil)
- Es wurde erkannt, dass Sie diesen Ordner nicht wirklich benötigen, um Teil des Codes zu sein
- Diesen Ordner gelöscht, verschoben
Zu diesem Zeitpunkt betrug die Größe des gesamten Git- Repos etwa 6 MB, wobei der tatsächliche Code (alle außer diesem Ordner) nur etwa 300 KB betrug .
Was ich am Ende suche, ist eine Möglichkeit, Details dieses Paketordners aus dem Git-Verlauf zu entfernen. Wenn jemand ihn klont, muss er keinen Verlauf im Wert von 6 MB herunterladen, in dem die einzigen tatsächlichen Dateien angezeigt werden Ab dem letzten Commit wären 300 KB.
Ich habe nach möglichen Lösungen dafür gesucht und diese beiden Methoden ausprobiert
- Datei aus dem Git-Repository entfernen (Verlauf)
- http://help.github.com/remove-sensitive-data/
- https://gist.github.com/1588371
Das Wesentliche schien zu funktionieren, als nach dem Ausführen des Skripts gezeigt wurde, dass dieser Ordner entfernt wurde, und danach, dass 50 verschiedene Commits geändert wurden. Aber ich konnte diesen Code nicht weitergeben. Als ich versuchte, es zu pushen, hieß es, Branch up to date
aber es wurden 50 Commits auf a geändert git status
. Die anderen beiden Methoden haben auch nicht geholfen.
Obwohl sich herausstellte, dass der Verlauf dieses Ordners gelöscht wurde, waren es immer noch etwa 6 MB, als ich die Größe dieses Repos auf meinem lokalen Host überprüfte. (Ich habe auch den refs/original
Ordner gelöscht , aber die Änderung der Größe des Repos nicht gesehen).
Was ich klären möchte, ist, ob es eine Möglichkeit gibt, nicht nur den Commit-Verlauf (der das einzige ist, was meiner Meinung nach passiert ist) loszuwerden, sondern auch die Dateien, von denen git immer wieder annimmt, dass man einen Rollback durchführen möchte.
Nehmen wir an, es wird eine Lösung dafür vorgestellt, die auf meinen lokalen Host angewendet wird, aber nicht auf dieses GitHub-Repo reproduziert werden kann. Ist es möglich, dieses Repo zu klonen, auf das erste Commit zurückzusetzen, den Trick auszuführen und es zu pushen (oder bedeutet das, dass Git es tut? Haben Sie noch eine Geschichte all dieser Commits? - aka. 6MB).
Mein Endziel hier ist es, im Grunde den besten Weg zu finden, um den Ordnerinhalt von git zu entfernen, damit ein Benutzer keine Inhalte im Wert von 6 MB herunterladen muss und möglicherweise noch die anderen Commits hat, die den Modulordner nie berührt haben (das ist hübsch viel von ihnen) in der Geschichte von Git.
Wie kann ich das machen?
quelle
Antworten:
Wenn Sie hier sind, um Code zu kopieren und einzufügen:
Dies ist ein Beispiel, das
node_modules
aus der Geschichte entfernt wirdWas Git eigentlich macht:
In der ersten Zeile werden alle Referenzen in demselben Baum (
--tree-filter
) wie HEAD (Ihr aktueller Zweig) durchlaufen und der Befehl ausgeführtrm -rf node_modules
. Dieser Befehl löscht die node_modules Ordner (-r
ohne-r
,rm
wird nicht löschen Ordner), ohne Aufforderung an den Benutzer gegeben (-f
). Das Hinzufügen--prune-empty
löscht nutzlose (nichts ändernde) Commits rekursiv.In der zweiten Zeile wird der Verweis auf diesen alten Zweig gelöscht.
Der Rest der Befehle ist relativ einfach.
quelle
git count-objects -v
überprüft, ob die Dateien tatsächlich entfernt wurden, aber die Größe des Repositorys bleibt gleich, bis ich das Repository erneut geklont habe. Git enthält eine Kopie aller Originaldateien, die ich denke.--force-with-lease
, nicht--force
.Ich finde, dass die
--tree-filter
in anderen Antworten verwendete Option sehr langsam sein kann, insbesondere bei größeren Repositorys mit vielen Commits.Hier ist die Methode, mit der ich ein Verzeichnis mit der
--index-filter
Option, die viel schneller ausgeführt wird , vollständig aus dem Git-Verlauf entfernen kann :Sie können die Größe des Repositorys vor und nach dem
gc
mit überprüfen :quelle
--quiet
desgit rm
obenNeben der beliebten Antwort oben Ich möchte ein paar Notizen für hinzufügen Windows - -Systeme. Der Befehl
funktioniert perfekt ohne Modifikation! Daher müssen Sie nicht verwenden
Remove-Item
,del
oder irgendetwas anderes stattrm -rf
.Wenn Sie einen Pfad zu einer Datei oder einem Verzeichnis angeben müssen, verwenden Sie Schrägstriche wie
./path/to/node_modules
quelle
Die beste und genaueste Methode, die ich gefunden habe, war das Herunterladen der Datei bfg.jar: https://rtyley.github.io/bfg-repo-cleaner/
Führen Sie dann die folgenden Befehle aus:
Wenn Sie Dateien löschen möchten, verwenden Sie stattdessen die Option Dateien löschen:
quelle
Vervollständigen Sie das Rezept zum Kopieren und Einfügen, indem Sie einfach die Befehle in den Kommentaren hinzufügen (für die Lösung zum Kopieren und Einfügen), nachdem Sie sie getestet haben:
Danach können Sie die Zeile "node_modules /" aus .gitignore entfernen
quelle
node_modules
aus.gitignore
? Damit sie versehentlich wieder begangen werden können ??node_modules
aus.gitignore
.Beachten Sie für Windows-Benutzer, dass
"
anstelle von'
Auch hinzugefügt verwendet wird-f
, um den Befehl zu erzwingen, wenn bereits eine andere Sicherung vorhanden ist.quelle
Es scheint , dass die up-to-date Antwort auf diese Frage ist nicht zu verwenden ,
filter-branch
direkt (mindestens git selbst es nicht mehr empfehlen) und defer , dass die Arbeit zu einem externen Tool. Insbesondere wird derzeit Git-Filter-Repo empfohlen. Der Autor dieses Tools liefert Argumente dafür, warum diefilter-branch
direkte Verwendung zu Problemen führen kann.Die meisten der oben
dir
aus dem Verlauf zu entfernenden mehrzeiligen Skripte können wie folgt umgeschrieben werden:Das Tool ist anscheinend leistungsfähiger als nur das. Sie können Filter nach Autor, E-Mail, Referenzname und mehr anwenden ( vollständige Manpage hier ). Darüber hinaus ist es schnell . Die Installation ist einfach - sie wird in verschiedenen Formaten verteilt .
quelle
pip3 install git-filter-repo
da es nur stdlib ist und keine Abhängigkeiten installiert. Unter Ubuntu 18 ist es nicht mit der Git-Version der Distribution kompatibelError: need a version of git whose diff-tree command has the --combined-all-paths option
, aber es ist einfach genug, um es auf einemdocker run -ti ubuntu:20.04
Ich habe die Ordner bin und obj aus alten C # -Projekten mit git unter Windows entfernt. Sei vorsichtig mit
Es zerstört die Integrität der Git-Installation, indem der Ordner usr / bin im Git-Installationsordner gelöscht wird.
quelle