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
risposta
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.
git diff HEAD origin/master --stat
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 –
@ 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? –
è piuttosto una stima approssimativa, quando sono coinvolti la compressione e le differenze binarie. Anche noioso se ci sono molte modifiche. –
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.
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