Predecir cuántos datos se enviarán en un push de git


De vez en cuando estoy en una conexión a Internet costosa y me gustaría saber (al menos aproximadamente) cuántos datos se enviarán al control remoto en un git push.

Author: Gerald Kaszuba, 2010-11-15

3 answers

En realidad, creo que me gusta mi comentario lo suficiente como para publicarlo como una respuesta!

Cuando envías, git crea un paquete de todos los objetos necesarios y los carga en el control remoto. Esto significa que estamos buscando una manera de predecir el tamaño del paquete. Dado que los paquetes están comprimidos, eso hace que sea muy difícil hacer algo basado en diferencias o tamaños de objetos; lo que realmente queremos hacer es ver qué tan grande será ese paquete. Sería bueno si pudiera interrumpir el empuje, justo después de que se construye el empaca, y decide proceder basado en el tamaño del paquete, pero no creo que eso sea posible. Mi mejor conjetura es intentar recrear el paquete que sería empujado e inspeccionar eso.

Un archivo bundle es básicamente un paquete con información de encabezado (eche un vistazo a la fuente si lo desea). Esto significa que es un comando de porcelana conveniente que va a crear un archivo con el tamaño que le importa. (Mucho más fácil que intentar usar pack-objects manualmente.) Usa algo como esto:

git bundle create foo.bundle ^origin/master master

Eso le dará un paquete que contiene todo lo necesario para llegar a master, dado que el control remoto tiene origin/master - exactamente lo mismo que debería ser empujado por git push origin master. Si tiene ramas adicionales que estará empujando, también puede agregarlas; solo está tomando args de lista de revoluciones:

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

Simplemente comprueba el tamaño de ese paquete creado; debería ser casi equivalente a lo que terminarás empujando. Esto significa que terminarás teniendo que crear el paquete dos veces (una vez con el paquete y una vez con el empuje), pero a menos que este sea un empuje realmente grande que tome mucho tiempo para empacar, eso no debería ser un gran problema.

 27
Author: Cascabel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-15 05:26:15

Puedes averiguarlo casi exactamente ejecutando un poco de Bash similar a lo que Git ejecutará internamente cuando cree el archivo pack para push:

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

Esto debería generar el recuento de bytes del archivo de paquete que enviaría Git. Desglosado:

# Find the common ancestor of HEAD and origin/master, and output a
# revision range (<a>..<b>) string to git pack-objects.
echo $(git merge-base HEAD origin/master)..HEAD

# Generate the pack file containing the revision range specified above, writing
# it to stdout.
git pack-objects --revs --thin --stdout -q

# Print the byte count of the file contents passed via stdin.
wc -c

Esto está condicionado a hacer un git fetch justo antes de que envíes; si no lo haces, Git no podrá encontrar el ancestro común y enviará el contenido de todo tu repositorio. Ver esta respuesta para más información.

 9
Author: Blair Holloway,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:39
git diff HEAD origin/master --stat
 2
Author: Ben Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-15 01:04:18