Holen Sie sich die Git-Zweiggröße

Lesezeit: 8 Minuten

Benutzeravatar von avellable
verfügbar

Ich versuche, die Größe eines Projekts zu verfolgen, an dem ich arbeite. Gibt es eine einfache Möglichkeit, die Repository-Größe auf der Festplatte für verschiedene Branches zu ermitteln?

Ich habe es versucht

git count-objects -v

Aber es gibt die gleiche Repository-Größe für jeden Zweig.

  • An anderer Stelle schlug jemand vor, ein “Bündel” mit nur den Dingen zu erstellen, die Sie benötigen, und sich die Größe anzusehen. Das könnte eine gute Annäherung an das sein, wonach Sie suchen: git bundle create <tmp-file> <branch> && du -sh <tmp-file>. Es berücksichtigt das Packen und Komprimieren, aber nicht die Größe des Repositorys auf der Festplatte, die Sie benötigen würden, um den Verlauf zu verwenden (Referenzen, Indexdatei, Konfigurationen usw.).

    – Gabel0

    2. Februar 2017 um 6:58 Uhr

Benutzeravatar von VonC
VonC

Mit Git 2.31 (Q1 2021), “git rev-list(Mann) Befehl gelernt --disk-usage Möglichkeit.

Es hat ein viele Beispieleaber in Bezug auf die Zweiggröße lautet der Befehl jetzt:

git rev-list --disk-usage --objects HEAD..<branch_name>

Für alle Filialen:

/* Report the disk size of each branch, not including objects used by the
  current branch. This can find outliers that are contributing to a
  bloated repository size (e.g., because somebody accidentally committed
  large build artifacts).
*/

git for-each-ref --format="%(refname)" |
while read branch
do
    size=$(git rev-list --disk-usage --objects HEAD..$branch)
    echo "$size $branch"
done |
sort -n

Sehen a1db097 übergeben, begehen 669b458 (17. Februar 2021) und 16950f8 übernehmen, Commit 3803a3a (09.02.2021) von Jeff König (peff).
(Zusammengeführt von Junio ​​C. Hamano — gitster in übertrage 6fe12b525.02.2021)

rev-list: Option –disk-usage zum Berechnen der Festplattennutzung hinzufügen

Unterzeichnet von: Jeff King

Es kann manchmal nützlich sein, zu sehen, welche Refs zur Gesamtgröße des Repositorys beitragen (z. B. hat ein Zweig eine Reihe von Objekten, die an keiner anderen Stelle im Verlauf gefunden wurden, was darauf hindeutet, dass das Löschen die Größe eines Klons verringern würde).

Sie können das herausfinden, indem Sie eine Liste von Objekten erstellen, ihre Größe aus der Cat-Datei abrufen und sie dann summieren, wie zum Beispiel:

git rev-list --objects --no-object-names main..branch
git cat-file --batch-check='%(objectsize:disk)' |
perl -lne '$total += $_; END { print $total }'

Beachten Sie jedoch, dass hier die Vorbehalte von git-cat-file(1) gelten.
Wir “beschuldigen” Basisobjekte mehr als ihre Deltas, obwohl die Beziehung leicht umgedreht werden könnte.
Dennoch kann es ein nützliches grobes Maß sein.

Aber ein Problem ist, dass es langsam läuft.
Das Anlernen der Drehzahlliste zum Zusammenfassen der Größen kann aus zwei Gründen viel schneller sein:

  1. Es überspringt alle Rohrleitungen von Objektnamen und -größen.
  2. Wenn Bitmaps verwendet werden, können wir für Objekte, die sich in der Bitmap-Packdatei befinden, die oid_object_info() vollständig nachschlagen und einfach den revindex nach der Größe auf der Festplatte fragen.

Dieser Patch implementiert a --disk-usage Option, die in einem Bruchteil der Zeit dieselbe Antwort liefert.
Hier sind einige Timings mit einem Klon von Torvalds/Linux:

[rev-list piped to cat-file, no bitmaps]
$ time git rev-list --objects --no-object-names --all |
  git cat-file --buffer --batch-check='%(objectsize:disk)' |
  perl -lne '$total += $_; END { print $total }'
1459938510
real  0m29.635s
user  0m38.003s
sys   0m1.093s

[internal, no bitmaps]
$ time git rev-list --disk-usage --objects --all
1459938510
real  0m31.262s
user  0m30.885s
sys   0m0.376s

Auch wenn die Wall-Clock-Zeit aufgrund der Parallelität etwas schlechter ist, beachten Sie die CPU-Einsparungen zwischen den beiden.
Wir haben 21 % der CPU eingespart, indem wir einfach die Pipes vermieden haben.

Aber der wirkliche Gewinn ist mit Bitmaps.
Wenn wir sie ohne die neue Option verwenden:

[rev-list piped to cat-file, bitmaps]
$ time git rev-list --objects --no-object-names --all --use-bitmap-index |
  git cat-file --batch-check='%(objectsize:disk)' |
  perl -lne '$total += $_; END { print $total }'
1459938510
real  0m6.244s
user  0m8.452s
sys   0m0.311s

dann sind wir schneller bei der Generierung der Objektliste, aber wir verbringen immer noch viel Zeit damit, Dinge zu leiten und nachzuschlagen.
Aber wenn wir beides zusammen machen:

[internal, bitmaps]
$ time git rev-list --disk-usage --objects --all --use-bitmap-index
1459938510
real  0m0.219s
user  0m0.169s
sys   0m0.049s

dann erhalten wir die gleiche Antwort viel schneller.

Für “–all” wird diese Antwort natürlich eng mit “du objects/pack” korrespondieren.
Aber wir überprüfen hier eigentlich die Erreichbarkeit, also sind wir immer noch schnell, wenn wir nach interessanteren Dingen fragen:

$ time git rev-list --disk-usage --use-bitmap-index v5.0..v5.10
374798628
real  0m0.429s
user  0m0.356s
sys   0m0.072s

rev-list-options schließt jetzt in seine ein Manpage:

--disk-usage

Normale Ausgabe unterdrücken; Geben Sie stattdessen die Summe der Bytes aus, die von den ausgewählten Commits oder Objekten für die Speicherung auf der Festplatte verwendet werden. Dies entspricht dem Weiterleiten der Ausgabe in git cat-file --batch-check='%(objectsize:disk)'außer dass es viel schneller läuft (besonders mit --use-bitmap-index). Siehe die CAVEATS
Abschnitt ein git cat-file für die Einschränkungen dessen, was “On-Disk-Storage” bedeutet.


Mit Git 2.38 (Q3 2022), “git rev-list --disk-usage(Mann) gelernt, einen optionalen Wert anzunehmen human um den gemeldeten Wert in einem für Menschen lesbaren Format anzuzeigen, wie “3.40MiB“.

Sehen Commit 9096451 (11. August 2022) von Li Linchao (Cactusinhand).
(Zusammengeführt von Junio ​​C. Hamano — gitster in fddd8b4 übergeben18.08.2022)

rev-list: unterstützt menschenlesbare Ausgabe für --disk-usage

Unterzeichnet von: Li Linchao

Die ‘--disk-usage‘Option für git-rev-list(Mann) eingeführt wurde 16950f8 (“rev-list: add(Mann) --disk-usage Option zur Berechnung der Festplattennutzung”, 09.02.2021, Git v2.31.0-rc0 — verschmelzen).

Dies ist sehr nützlich für Leute, die die Nutzungsinformationen ihrer Git-Repository-Objekte überprüfen, aber die resultierende Zahl ist für einen Menschen ziemlich schwer zu lesen.

Unterrichten git rev-list um ein für Menschen lesbares Ergebnis auszugeben, wenn ‘–disk-usage=human’ verwendet wird.

rev-list-options schließt jetzt in seine ein Manpage:

Mit dem optionalen Wert humanwird die Speichergröße auf der Festplatte in einer für Menschen lesbaren Zeichenfolge angezeigt (z 12.24 Kib, 3.50 Mib).

Benutzeravatar von JB
JB.

Hier ist etwas wirklich hässliches:

$ git rev-list HEAD |                     # list commits
  xargs -n1 git ls-tree -rl |             # expand their trees
  sed -e 's/[^ ]* [^ ]* \(.*\)\t.*/\1/' | # keep only sha-1 and size
  sort -u |                               # eliminate duplicates
  awk '{ sum += $2 } END { print sum }'   # add up the sizes in bytes

Dies zählt nur die Blobs (keine Commits, Bäume usw.) und berücksichtigt weder das Packen noch die branchenübergreifende gemeinsame Nutzung von Objekten. Aber es könnte als Grundlage für etwas Nützliches dienen.

Einfügbare Version:

git rev-list HEAD | xargs -n1 git ls-tree -rl | sed -e 's/[^ ]* [^ ]* \(.*\)\t.*/\1/' | sort -u | awk '{ sum += $2 } END { print sum }'

  • Verwenden git rev-list --objects master |git cat-file --batch-check='%(objectsize) %(objecttype) %(objectname) %(rest)' um die Größen aller Objekte zu erhalten, die verwendet werden, um den Verlauf eines Zweigs zu erstellen (oder eigentlich jede Definition eines Verlaufsgraphen). Es berücksichtigt immer noch kein Delta-Packing oder Komprimierung, gibt aber genaue Informationen darüber, wie viel Speicherplatz Sie benötigen, um alle eindeutigen Daten eines Repositorys zu speichern.

    – Gabel0

    2. Februar 2017 um 6:53 Uhr

  • Ist es in Bytes?

    – mr5

    21. Juni 2017 um 5:53 Uhr

  • @mr5 Der Kommentar sagt: # add up the sizes in bytes. Also ja, ich denke schon 😀

    – JB.

    21. Juni 2017 um 13:18 Uhr

  • Das war zu langsam für mein Repo. Ich habe es beschleunigt: git rev-list HEAD | nl | xargs -n 2 -P 8 sh -c 'git ls-tree -rl "$1" | perl -p -e "\$_ =~ s/[^ ]*+ [^ ]*+ ([^ ]*+) ++([^\t]*+)\t.*+/\1 \2/" | sort > logfile-$0' ; sort -m -u logfile-* | awk '{ sum += $2 } END { print sum }'

    – Kevin Smyth

    15. Dezember 2017 um 17:07 Uhr


Diese Frage ist nicht wirklich sinnvoll – in Git werden Branches nicht separat gespeichert. Stattdessen gibt es ein Netz von Commits, und im Grunde werden nur die Diffs gespeichert. Die Verzweigungen sind nur Zeiger auf bestimmte Commits in diesem Web von Commits. Im Allgemeinen teilen Zweige also viele der gleichen Informationen.

Wenn Sie die Größe des Speicherplatzes eines einzelnen Zweigs wissen möchten, d. h. die minimale Menge an Speicherplatz, die jemand benötigt, wenn er das Repo klont und nur diesen Zweig verwendet, ist es wahrscheinlich am einfachsten, einfach so ein Repo zu erstellen. und fragen Sie dann nach der Größe dieses Repos.

  • Ich stimme dem zu, was Sie sagen wollen. Und ich weiß, wie Git funktioniert. Alles, was ich tun möchte, ist, die Nutzung der Festplattengröße im Laufe der Zeit zu erhöhen.

    – verfügbar

    14. September 2015 um 5:37 Uhr

  • Hm, ich glaube, ich verstehe. Vielleicht können Sie versuchen, das Repo zu klonen, dann einen Zweig zu löschen und dann auszuführen git gc --aggressive um die baumelnden Knoten zu bereinigen und dann die Festplattennutzung zu überprüfen?

    – Chris Beck

    14. September 2015 um 5:43 Uhr


  • Gute Antwort. Eines jedoch; du schreibst: […] im Grunde werden nur die Diffs gespeichert. Sofern Sie sich nicht auf Packs beziehen, ist diese Aussage falsch.

    – jub0bs

    14. September 2015 um 6:19 Uhr


  • @Jubobs Ich sehe, wohin du gehst, aber das ist theoretisch. Da sich die Frage auf die tatsächliche Speicherung auf der Festplatte bezieht, ist es richtig, sich auf die Implementierung des Pakets zu beziehen.

    – Schwern

    14. September 2015 um 6:32 Uhr


Benutzeravatar von zhaokh
zhaokh

  1. Klonen Sie Ihr Repository.
  2. schauen Sie in Ihrer Fachbranche nach.
  3. Größe des Projektverzeichnisses – Größe der .git-Datei des Repos = Größe des Zweigs. Hinweis: .git beinhaltet index\ref\tags\objects des Repos.
1439250cookie-checkHolen Sie sich die Git-Zweiggröße

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy