2010-11-14 4 views
23

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

+1

Esto parece complicado ... los impulsos están comprimidos, por lo que, para saberlo realmente, querría interrumpir una vez que haya creado el paquete pero antes de que lo envíe. Podría intentar verificar el tamaño del paquete correspondiente, aunque eso significa que efectivamente se empaqueta dos veces. – Cascabel

Respuesta

25

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

Cuando empujas, git crea un paquete de todos los objetos necesarios y los sube al control remoto. Esto significa que estamos buscando una forma de predecir ese tamaño de paquete. Como los paquetes están comprimidos, eso hace que sea muy difícil hacer cualquier cosa en función de los tamaños de objeto o diffs; lo que realmente queremos hacer es ver cuán grande será ese paquete. Sería bueno si pudieras interrumpir el empujón, justo después de que se construyó el paquete, y decidir proceder según el tamaño del paquete, pero no creo que eso sea posible. Mi mejor intento es tratar de recrear el paquete que se empujaría e inspeccionarlo.

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

git bundle create foo.bundle ^origin/master master 

Eso le daremos un paquete que contiene todo lo necesario para llegar a dominar, dado que la distancia tiene origin/master - exactamente el mismo Lo que debe ser empujado por git push origin master. Si tienes ramas adicionales que estarás presionando, puedes virarlas también; solo está tomando args de la lista de reválvulas:

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

Simplemente verifique el tamaño de ese paquete creado; debería ser casi equivalente a lo que terminará presionando. Esto significa que terminarás teniendo que crear el paquete dos veces (una vez con el paquete y otra vez con el botón), pero a menos que sea un gran empujón que lleve mucho tiempo empacar, no debería ser un gran problema

2
git diff HEAD origin/master --stat 
+0

Esto no muestra el ancho de banda, me sale: git push-dry run -v Empujar a [email protected]: Proyecto Para [email protected]: Proyecto maestro fbe6184..7b7a3bc -> maestro –

+0

@ Gerald, prueba usar el comando git diff en su lugar. El ejemplo que publiqué arriba le mostrará qué archivos han cambiado y cuántas líneas de inserciones y eliminaciones hay en cada uno. ¿Es suficiente información para seguir? –

+0

es una estimación aproximada, cuando la compresión y las diferencias binarias están involucradas. También tedioso si hay muchas modificaciones. –

9

Usted puede encontrar casi exactamente mediante la ejecución de un poco similar de golpe a lo que Git se ejecutará internamente cuando se crea el archivo de paquete para empujar:

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

Esta debe ser la salida el byte recuento de la manada archivo que Git enviaría. Analizado:

# 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 

Ésta es la condición de hacer un git fetch justo antes de empujar; si no lo hace, Git no podrá encontrar el ancestro común y enviará los contenidos de su repositorio completo. Ver this answer para más información.