Skip to content

Git-Repositories packen ...

So ein lebendes Git-Repository ist ziemlicher "Platzverschwender". Mein Hauptrepository, in dem alle meine Dokumente und Scans und Bewerbungen und Skripte und einfach alles liegen, wurde grösser und grösser. Zum Schluss war es bei 16 GB obwohl die "Nutzdaten" nur einen Bruchteil des Repositories ausmachten.

Zeit, einmal einen git repack anzustossen.

Wenn man das unbedarft auf ein grosses Repository loslässt, merkt man sehr schnell, wie langsam der Rechner werden kann, wenn er ins Swapping fällt. Um das einzugrenzen, sollte der Parameter --window-memory gesetzt werden. Meine Beobachtung ist, dass der pro Core gilt. Die Parameter --window und --depth geben die Tiefe und die Anzahl der Objekte für die Delta-Kompression an. -a sorgt dafür, dass alles in gross Packs gepackt wird und -d, dass obsolet gewordene Packs gelöscht werden.

Damit kann man eine Menge erreichen.

16G	ddeimeke.git
Counting objects: 19947, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (7173/7173), done.
Writing objects: 100% (19947/19947), done.
Total 19947 (delta 14053), reused 17947 (delta 12645)
6.4G	ddeimeke.git


Allerdings bremst das den Rechner so aus, dass kaum noch arbeiten möglich ist, was man aber mit nice und ionice in den Griff bekommt. Ersteres sorgt dafür, dass die CPU-Benutzung limitiert wird und zweiteres tut gleiches für I/O.

In Summe resultiert das in folgendes kleine Skript.

#!/bin/bash

for i in *.git
do
        du -hsx "${i}"
        cd "${i}"
        nice -n 19 ionice -c 2 -n 7 git repack -a -d --depth=250 --window=250 --window-memory=1g
        cd ..
        du -hsx "${i}"
        echo
done

Trackbacks

Dirks Logbuch am : Git swapped beim Packen ...

Vorschau anzeigen
Von Zeit zu Zeit lohnt es sich Git-Repositories neu zu packen oder den Müll weg zu bringen (mittels "garbage collection, der Befehl ist git gc). Auch beim Auschecken oder Klonen von grossen Repositories packt Git neu. Da ich mit den Standard-Einstellungen

Kommentare

Ansicht der Kommentare: Linear | Verschachtelt

Axel Beckert am :

*Auch wenn ich kaum so grosse Repos habe (dafür eher viele kleine), so kommt mir das Problem (u.a. wegen der nur 4 GB grossen SSD im EeePC) sehr bekannt vor.

Und das Skript auch. :-) Jedenfalls sieht meines recht ähnlich aus, nur, dass es das ganze rekursiv macht.

Aufgrund dessen, dass ich relativ viele Git-Repos habe, habe ich Gefallen an mr (steht für "multiple repositories") gefunden. Mit ihm kann ich Aktionen auf mehreren Repositories gleichzeitig ausführen, müssen nicht mal alles Git-Repos sein. Allerdings steckt meine Infrastruktur dafür noch in den Kinderschuhen. Stelle mir da so etwas wie RichiH's mr template vor. Ob mit oder ohne vcsh weiss ich allerdings noch nicht.

Dirk Deimeke am :

*Danke für den Tipp mit "mr", das muss ich mir einmal näher anschauen.

Rekursiv brauche ich nicht, da bei mir alle Verzeichnisse mit Git-Repositories die Endung ".git" haben. Das macht es leichter.

Für Leute mit Leerzeichen in Verzeichnisnamen würde ich $i noch in Anführungszeichen setzen, das wurde mir auch empfohlen (ich habe keine Verzeichnisse mit Leerzeichen).

Kommentar schreiben

Gravatar, Favatar, Pavatar, Identica, Twitter, MyBlogLog Autoren-Bilder werden unterstützt.
BBCode-Formatierung erlaubt
Umschließende Sterne heben ein Wort hervor (*wort*), per _wort_ kann ein Wort unterstrichen werden.
Standard-Text Smilies wie :-) und ;-) werden zu Bildern konvertiert.
Die angegebene E-Mail-Adresse wird nicht dargestellt, sondern nur für eventuelle Benachrichtigungen verwendet.
:'(  :-)  :-|  :-O  :-(  8-)  :-D  :-P  ;-) 
Formular-Optionen