remove - git tags best practices
Predecir la cantidad de datos que se enviarán en un empujón git (3)
Ocasionalmente, tengo una conexión a Internet costosa y me gustaría saber (al menos aproximadamente) cuánta información se enviará al control remoto en un git push
.
En realidad, creo que me gusta mi comentario lo suficiente como para publicarlo como una respuesta.
Cuando presionas, 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 diferentes tamaños o objetos; Lo que realmente queremos hacer es ver qué tan grande será ese paquete. Sería bueno si pudieras interrumpir el empuje, justo después de que se haya construido el paquete, y decidas continuar en función del tamaño del paquete, pero no creo que sea posible. Mi mejor conjetura es tratar de recrear el paquete que se empujaría e inspeccionar eso.
Un archivo de paquete es básicamente un paquete con información de encabezado (mire la fuente si lo desea). Esto significa que es un comando de porcelana conveniente que creará un archivo con el tamaño que le interesa. (Mucho más fácil que tratar de usar pack-objects manualmente.) Usa algo como esto:
git bundle create foo.bundle ^origin/master master
Eso te dará un paquete que contiene todo lo necesario para llegar al master, dado que el control remoto tiene origin / master, exactamente lo mismo que debe ser empujado por git push origin master
. Si tienes ramas adicionales que vas a empujar, también puedes pegarlas; solo está tomando rev-list args:
git bundle create foo.bundle ^origin/master master ^origin/topic topic ...
Solo verifica el tamaño de ese paquete creado; Debería ser casi equivalente a lo que acabarás presionando. 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 sea un empujón realmente grande que demore mucho tiempo en empacar, eso no debería ser un problema. gran problema
Puedes descubrirlo exactamente exactamente ejecutando un poco de Bash similar a lo que Git ejecutará internamente cuando cree el archivo de paquete para enviar:
$ echo $(git merge-base HEAD origin/master)..HEAD | git pack-objects --revs --thin --stdout -q | wc -c
Esto debería generar el conteo de bytes del paquete de archivos que Git enviaría. 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 empujar; Si no lo hace, Git no podrá encontrar el antepasado común y enviará el contenido de todo su repositorio. Ver esta respuesta para más información.
git diff HEAD origin/master --stat