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.
Antworten
Zu viele Anzeigen?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.
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.
**
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.