2010-11-14 11 views
23

Sono occasionalmente in una costosa connessione Internet e vorrei sapere (almeno approssimativamente) quanti dati verranno inviati al telecomando in un git push.Prevedere la quantità di dati da inviare in un push git

+1

Questo sembra difficile ... le spinte sono compresse, e quindi per sapere davvero, si vorrebbe interrompere dopo aver creato il pacchetto ma prima di inviarlo. Potresti provare a controllare la dimensione del pacchetto corrispondente, sebbene ciò significhi effettivamente un doppio imballaggio. – Cascabel

risposta

25

In realtà, penso che il mio commento mi piaccia abbastanza da postarlo come risposta!

Quando si preme, git crea un pacchetto di tutti gli oggetti necessari e li carica sul telecomando. Ciò significa che stiamo cercando un modo per prevedere la dimensione del pacco. Dato che i pacchetti sono compressi, ciò rende molto difficile fare qualsiasi cosa sulla base delle differenze o delle dimensioni degli oggetti; quello che vogliamo veramente è vedere quanto sarà grande quel pacchetto. Sarebbe bello se tu potessi interrompere il push, subito dopo aver costruito il pacchetto, e decidere di procedere in base alle dimensioni del pacchetto, ma non credo sia possibile. La mia ipotesi migliore è provare a ricreare il pacchetto che verrebbe spinto e ispezionato.

Un file bundle è fondamentalmente un pacchetto con informazioni di intestazione (dare un'occhiata a the source se lo si desidera). Ciò significa che è un comodo comando di porcellana che creerà un file con le dimensioni che ti interessano. (Molto più facile che cercare di usare pack-objects manualmente.) Usa qualcosa come questo:

git bundle create foo.bundle ^origin/master master 

Che ti do un pacco contenente tutto il necessario per arrivare al padrone, visto che il telecomando ha origin/master - esattamente lo stesso cosa che dovrebbe essere spinta da git push origin master. Se hai altri rami che spingi, puoi attaccarli anche tu; è solo prendendo argomenti di rev-list:

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

Basta controllare la dimensione di quel pacchetto creato; dovrebbe essere quasi equivalente a quello che finirai per spingere. Questo significa che finirai per dover creare il pacchetto due volte (una volta con il bundle e una volta con il push), ma a meno che non si tratti di una spinta davvero grande che richiede molto tempo per fare i bagagli, non dovrebbe essere un enorme problema.

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

Questo non mostra la larghezza di banda, ottengo: git push --dry-run -v Spingendo a [email protected]: progetto Per [email protected]: progetto maestro fbe6184..7b7a3bc -> padrone –

+0

@ Gerald, prova a usare il comando git diff. L'esempio che ho postato sopra ti mostrerà quali file sono cambiati e quante linee di inserzioni e cancellazioni in ciascuna. Sono sufficienti informazioni per passare? –

+0

è piuttosto una stima approssimativa, quando sono coinvolti la compressione e le differenze binarie. Anche noioso se ci sono molte modifiche. –

9

Potete trovare più o meno esattamente eseguendo un po 'simile di Bash a quello che Git verrà eseguito internamente quando si crea il file pacchetto di spingere:

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

Questo stamperà il byte-count del pacco il file Git avrebbe inviato. Ripartiti:

# 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 

Questo è subordinata facendo un git fetch destra prima di spingere; se non lo fai, Git non sarà in grado di trovare l'antenato comune e invierà il contenuto dell'intero repository. Vedi this answer per maggiori informazioni.