Mein Projekt ist sechs Monate alt und Git ist sehr, sehr langsam. Wir verfolgen rund 30 Dateien mit einer Größe von 5 MB bis 50 MB. Das sind Binärdateien und wir halten sie in Git. Ich glaube, diese Dateien machen Git langsam.
Gibt es eine Möglichkeit, alle Dateien mit einer Größe von> 5 MB aus dem Repository zu löschen? Ich weiß, dass ich all diese Dateien verlieren würde und das ist okay für mich.
Idealerweise hätte ich gerne einen Befehl, der alle großen Dateien (> 5 MB) auflistet. Ich kann die Liste sehen und dann sage ich okay, mach weiter und lösche diese Dateien und mache Git schneller.
Ich sollte erwähnen, dass git nicht nur auf meinem Computer langsam ist, sondern die Bereitstellung der App in einer Staging-Umgebung jetzt etwa 3 Stunden dauert.
Das Update sollte sich also auf den Server und nicht nur auf die Benutzer des Repositorys auswirken.
git-bigfiles
Projekt zu verwendenAntworten:
Sammeln Sie Müll?
Dies macht einen signifikanten Geschwindigkeitsunterschied, selbst bei kleinen Repos.
quelle
gc
.git gc
kann unmöglich aufgerufen werdencommit
und würdemerge
sonstgit fsck --unreachable
nie etwas zurückgeben.gc
Ausführung beträgt 6700. Dies erklärt, warum ich sie noch nie ausgeführt habe.Erläuterung
Git ist wirklich gut in großen Historien kleiner Textdateien, weil es sie und ihre Änderungen effizient speichern kann. Gleichzeitig ist git bei Binärdateien sehr schlecht und speichert naiv separate Kopien der Datei ( zumindest standardmäßig ). Das Repository wird riesig und dann langsam, wie Sie beobachtet haben.
Dies ist ein häufiges Problem bei DVCS, das durch die Tatsache verschärft wird, dass Sie bei jedem Klonen jede Version jeder Datei ("das gesamte Repository") herunterladen. Die Jungs von Kiln arbeiten an einem Plugin, um diese großen Dateien eher wie Subversion zu behandeln, das nur historische Versionen auf Anfrage herunterlädt.
Lösung
Dieser Befehl listet alle Dateien im aktuellen Verzeichnis mit der Größe> = 5 MB auf.
Wenn Sie die Dateien aus dem gesamten Verlauf des Repositorys entfernen möchten, können Sie diese Idee verwenden
git filter-branch
, um den Verlauf zu durchlaufen und alle Spuren großer Dateien zu entfernen . Danach werden alle neuen Klone des Repositorys schlanker. Wenn Sie ein Repository ohne Klonen einrichten möchten, finden Sie Anweisungen auf der Manpage (siehe "Checkliste zum Verkleinern eines Repositorys").Ein Wort der Warnung : Dadurch wird Ihr Repository nicht mit anderen Klonen kompatibel , da in den Bäumen und Indizes unterschiedliche Dateien eingecheckt sind. Sie können nicht mehr von ihnen drücken oder ziehen.
quelle
find
an eine Datei senden , die Liste überprüfen und dann verwendengit rm
, nur für den Fall, dass falsche Treffer vorliegen. Alternativ können Siegit status
nach dem Entfernen großer Dateien überprüfen, obgit checkout HEAD <file>
versehentlich entfernte Dateien wiederhergestellt wurden.Hier ist eine zensierte Revision, die weniger negativ und entzündlich sein soll:
Git hat eine bekannte Schwäche, wenn es um Dateien geht, die keine zeilenweisen Textdateien sind. Derzeit gibt es keine Lösung und keine Pläne des Git-Kernteams, dies zu beheben. Es gibt Problemumgehungen, wenn Ihr Projekt klein ist, z. B. 100 MB oder so. Es gibt Zweige des Git-Projekts, um dieses Skalierbarkeitsproblem zu beheben, aber diese Zweige sind derzeit noch nicht ausgereift. Einige andere Revisionskontrollsysteme haben dieses spezielle Problem nicht. Sie sollten dieses Problem als einen von vielen Faktoren betrachten, wenn Sie entscheiden, ob Sie git als Ihr Revisionskontrollsystem auswählen möchten.
quelle
Binärdateien und die Art und Weise, wie Git mit ihnen umgeht, sind nicht spezifisch. Wenn Sie eine Datei zu einem Git-Repository hinzufügen, wird ein Header hinzugefügt und die Datei mit zlib komprimiert und nach dem SHA1-Hash umbenannt. Dies ist unabhängig vom Dateityp genau gleich. Es gibt nichts in der zlib-Komprimierung, was es für Binärdateien problematisch macht.
Aber an einigen Stellen (Pushing, GC) beginnt Git, die Möglichkeit zu prüfen, Inhalte zu deltakomprimieren. Wenn git ähnliche Dateien findet (Dateiname usw.), werden sie in den Arbeitsspeicher gestellt und zusammen komprimiert. Wenn Sie 100 Dateien haben und jede von ihnen 50 MB sagt, wird versucht, 5 GB gleichzeitig in den Speicher zu legen. Dazu müssen Sie noch etwas hinzufügen, damit die Dinge funktionieren. Ihr Computer verfügt möglicherweise nicht über diese RAM-Größe und beginnt zu tauschen. Der Prozess braucht Zeit.
Sie können die Tiefe der Delta-Komprimierung begrenzen, damit der Prozess nicht so viel Speicher belegt, das Ergebnis jedoch eine weniger effiziente Komprimierung ist. (core.bigFileThreshold, Delta-Attribut, pack.window, pack.depth, pack.windowMemory usw.)
Es gibt also viele Möglichkeiten, wie Sie Git dazu bringen können, mit großen Dateien sehr gut zu funktionieren.
quelle
Eine Möglichkeit, die Dinge zu beschleunigen, besteht darin, die
--depth 1
Flagge zu verwenden. Weitere Informationen finden Sie in der Manpage. Ich bin kein großer Git-Guru, aber ich glaube, dies sagt, mach das Äquivalent von ap4 get
oder ansvn get
, das heißt, es gibt dir nur die neuesten Dateien, anstatt "gib mir alle Revisionen aller Dateien durchgehend" wasgit clone
macht.quelle
Hast du Git gesagt, dass diese Dateien binär sind?
zB
*.ext binary
zu Ihrem Repository hinzugefügt.gitattributes
quelle
Sie können BFG Repo Cleaner auch als eine schnellere und einfachere Möglichkeit betrachten, große Dateien zu bereinigen.
https://rtyley.github.io/bfg-repo-cleaner/
quelle
Ich habe Git seit 2008 sowohl unter Windows als auch unter GNU / Linux ausgeführt und die meisten Dateien, die ich verfolge, sind Binärdateien. Einige meiner Repos haben mehrere GB und enthalten JPEG und andere Medien. Ich habe viele Computer sowohl zu Hause als auch bei der Arbeit, auf denen Git ausgeführt wird.
Ich hatte noch nie die Symptome, die im ursprünglichen Beitrag beschrieben sind. Aber vor ein paar Wochen habe ich MsysGit auf einem alten Win-XP-Laptop installiert und fast alles, was ich getan habe, hat git zum Stillstand gebracht. Selbst der Test mit nur zwei oder drei kleinen Textdateien war lächerlich langsam. Wir sprechen über 10 Minuten, um eine Datei mit weniger als 1 KB hinzuzufügen ... es scheint, als ob die Git-Prozesse für immer am Leben geblieben sind. Alles andere funktionierte wie erwartet auf diesem Computer.
Ich habe ein Downgrade von der neuesten Version auf 1.6 durchgeführt und die Probleme waren behoben ...
Ich habe andere Laptops derselben Marke, auch mit Win-XP, das von derselben IT-Abteilung installiert wurde, mit demselben Image, wobei Git unabhängig von der Version einwandfrei funktioniert. .. Also muss es etwas Seltsames mit diesem bestimmten Computer geben.
Ich habe auch einige Tests mit Binärdateien und Komprimierung durchgeführt. Wenn Sie ein BMP-Bild haben und kleine Änderungen daran vornehmen und diese festschreiben, wird git gc sehr gut komprimiert. Mein Fazit ist also, dass die Komprimierung nicht davon abhängt, ob die Dateien binär sind oder nicht.
quelle
Richten Sie die Dateien einfach so ein, dass sie ignoriert werden. Siehe den Link unten:
http://help.github.com/git-ignore/
quelle
Das liegt daran, dass Git nicht skalierbar ist.
Dies ist eine schwerwiegende Einschränkung bei Git, die durch die Befürwortung von Git übertönt wird. Durchsuchen Sie die Git-Mailinglisten und Sie werden Hunderte von Benutzern finden, die sich fragen, warum nur magere 100 MB Bilder (z. B. für eine Website oder Anwendung) Git in die Knie zwingen. Das Problem scheint zu sein, dass fast alle Git auf einer Optimierung beruhen, die sie als "Packen" bezeichnen. Leider ist das Packen für alle außer den kleinsten Textdateien (dh Quellcode) ineffizient. Schlimmer noch, es wird mit zunehmender Geschichte immer weniger effizient.
Es ist wirklich ein peinlicher Fehler in Git, der (trotz fehlender Beweise) als "schnell" angepriesen wird, und die Git-Entwickler sind sich dessen sehr wohl bewusst. Warum haben sie es nicht behoben? Auf der Git-Mailingliste finden Sie Antworten von Git-Entwicklern, die das Problem nicht erkennen, da sie Photoshop-Dokumente (* .psd) im proprietären Format haben. Ja, es ist wirklich so schlimm.
Hier ist das Ergebnis:
Verwenden Sie git für winzige Projekte, die nur aus Quellcode bestehen und für die Sie kein separates Repo einrichten möchten. Oder nur für kleine Quellcode-Projekte, bei denen Sie das git-Modell des gesamten Repo-Modells der dezentralen Entwicklung nutzen möchten. Oder wenn Sie einfach ein neues Werkzeug lernen möchten. All dies sind gute Gründe, Git zu verwenden, und es macht immer Spaß, neue Tools zu lernen.
Verwenden Sie git nicht, wenn Sie eine große Codebasis, Binärdateien, einen großen Verlauf usw. haben. Nur eines unserer Repos ist eine TB. Git kann damit nicht umgehen. VSS, CVS und SVN können damit problemlos umgehen. (SVN bläht sich jedoch auf.)
Geben Sie git auch Zeit zum Reifen. Es ist noch unreif, aber es hat viel Schwung. Mit der Zeit denke ich, dass die praktische Natur von Linus die OSS-Puristen überwinden wird und Git irgendwann im größeren Bereich eingesetzt werden kann.
quelle