37 Stimmen

Schätzen Sie, wie viele Daten bei einem git push übertragen werden.

Manchmal bin ich über eine teure Internetverbindung verbunden und ich würde gerne wissen (zumindest ungefähr), wie viele Daten bei einem git push zum Remote-Server übertragen werden.

1 Stimmen

Dies scheint knifflig zu sein... Pushes werden komprimiert, und um es wirklich zu wissen, müssten Sie nach der Erstellung des Packs, aber vor dem Senden, unterbrechen. Sie könnten versuchen, die Größe des entsprechenden Bundles zu überprüfen, obwohl das effektiv bedeutet, dass Sie zweimal packen.

32voto

Cascabel Punkte 449595

Eigentlich denke ich, dass mir mein Kommentar gut genug gefällt, um ihn als Antwort zu veröffentlichen!

Wenn du pushst, erstellt Git ein Paket mit allen notwendigen Objekten und lädt es auf den Remote hoch. Das bedeutet, wir suchen nach einer Möglichkeit, die Größe dieses Pakets vorherzusagen. Da die Pakete komprimiert sind, ist es sehr schwierig, etwas auf Diffs oder Objektgrößen basierend zu tun; was wir wirklich wollen, ist einfach nur zu sehen, wie groß dieses Paket sein wird. Es wäre schön, wenn du den Push unterbrechen könntest, direkt nachdem das Paket erstellt wurde, und dann auf Grundlage der Paketgröße weitermachen könntest, aber ich glaube nicht, dass das möglich ist. Mein bester Tipp ist, zu versuchen, das Paket neu zu erstellen, das gepusht werden würde, und das zu inspizieren.

Ein Bundle-Datei ist im Grunde genommen ein Paket mit Kopfinformationen (schau dir die Quelle an, wenn du möchtest). Das bedeutet, es ist ein praktischer Porzellan-Befehl, der eine Datei mit der von dir gewünschten Größe erstellen wird. (Viel einfacher als zu versuchen, pack-objects manuell zu verwenden.) Verwende etwas wie folgt:

git bundle create foo.bundle ^origin/master master

Das wird dir ein Bundle geben, das alles enthält, was benötigt wird, um zu Master zu gelangen, vorausgesetzt, der Remote hat origin/master - genau das Gleiche, das von git push origin master gepusht werden sollte. Wenn du zusätzliche Branches hast, die du pushen wirst, kannst du sie ebenfalls hinzufügen; es sind nur rev-list-Argumente:

git bundle create foo.bundle ^origin/master master ^origin/topic topic ...

Überprüfe einfach die Größe dieses erstellten Bundles; es sollte fast äquivalent sein zu dem, was du schlussendlich pushen wirst. Dies bedeutet, dass du das Paket zweimal erstellen musst (einmal mit dem Bundle und einmal mit dem Push), aber es sei denn, es handelt sich um einen wirklich großen Push, der eine lange Zeit benötigt, um verpackt zu werden, sollte das kein großes Problem sein.

10voto

Blair Holloway Punkte 15119

Sie können ziemlich genau herausfinden, was Git intern ausführt, wenn es die Pack-Datei zum Pushen erstellt, indem Sie einfach einen ähnlichen Bash-Befehl ausführen:

$ echo $(git merge-base HEAD origin/master)..HEAD | git pack-objects --revs --thin --stdout -q | wc -c

Dies sollte die Byte-Anzahl der Pack-Datei ausgeben, die Git senden würde. Aufgeschlüsselt:

# Finden des gemeinsamen Vorfahren von HEAD und origin/master und Ausgabe eines
# Revisionsbereichs (..) Strings an git pack-objects.
echo $(git merge-base HEAD origin/master)..HEAD

# Erzeugen der Pack-Datei, die den oben angegebenen Revisionsbereich enthält und Schreiben
# auf stdout.
git pack-objects --revs --thin --stdout -q

# Ausgabe der Byte-Anzahl des Dateiinhalts, der über stdin übergeben wurde.
wc -c

**

Dies ist abhängig davon, ob Sie direkt vor dem Pushen ein git fetch durchführen; wenn nicht, wird Git den gemeinsamen Vorfahren nicht finden können und den Inhalt Ihres gesamten Repositories senden. Siehe diese Antwort für weitere Informationen.

**

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X