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
Damit kann man eine Menge erreichen.
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.
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
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 :
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 :
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).