2010-11-14 6 views
23

Je suis occasionnellement sur une connexion Internet coûteuse et je voudrais savoir (au moins environ) combien de données seront poussées vers la télécommande dans un git push.Prédire combien de données seront poussées dans une poussée git

+1

Cela semble difficile ... les poussées sont compressées, et donc pour vraiment savoir, vous voudriez interrompre après avoir créé le pack mais avant qu'il n'envoie. Vous pouvez essayer de vérifier la taille du paquet correspondant, mais cela signifie que vous empaquetez deux fois. – Cascabel

Répondre

25

En fait, je pense que j'aime assez mon commentaire pour l'afficher comme réponse! Lorsque vous appuyez sur, git crée un pack de tous les objets nécessaires et les télécharge vers la télécommande. Cela signifie que nous cherchons un moyen de prédire la taille de l'emballage. Comme les packs sont compressés, il est très difficile de faire quoi que ce soit en fonction des différences ou des tailles d'objets; ce que nous voulons vraiment faire, c'est juste voir à quel point ce pack sera grand. Ce serait bien si vous pouviez interrompre la poussée, juste après avoir construit le pack, et décider de continuer en fonction de la taille du pack, mais je ne pense pas que ce soit possible. Ma meilleure idée est d'essayer de recréer le pack qui serait poussé et d'inspecter ça. Un fichier groupé est essentiellement un pack avec des informations d'en-tête (consultez the source si vous le souhaitez). Cela signifie que c'est une commande pratique en porcelaine qui va créer un fichier avec la taille qui vous intéresse. (Beaucoup plus facile que d'essayer d'utiliser pack-objects manuellement.) Utilisez quelque chose comme ceci:

git bundle create foo.bundle ^origin/master master 

Cela vous donnera un paquet contenant tout le nécessaire pour obtenir à maîtriser, étant donné que la télécommande est d'origine/maître - exactement la même chose qui devrait être poussé par git push origin master. Si vous avez des branches supplémentaires, vous pouvez les utiliser également; il prend juste les arguments rev-list:

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

Vérifiez simplement la taille de cet ensemble créé; cela devrait être presque équivalent à ce que vous finirez par pousser. Cela signifie que vous allez devoir créer le pack deux fois (une fois avec le bundle et une fois avec le push), mais à moins que ce soit une grosse poussée qui prend beaucoup de temps à emballer, ça ne devrait pas être un énorme problème.

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

Cela ne montre pas la bande passante, je reçois: git push --dry-run -v Poussant à [email protected]: projet Pour [email protected]: projet fbe6184..7b7a3bc maître -> maître –

+0

@ Gerald, essayez d'utiliser la commande git diff à la place. L'exemple que j'ai posté ci-dessus vous montrera quels fichiers ont changé et combien de lignes d'insertions et de suppressions dans chaque fichier. Est-ce assez d'information pour passer? –

+0

c'est une estimation assez approximative, quand la compression et les différences binaires sont impliquées. Aussi fastidieux s'il y a beaucoup de modifications. –

9

Vous pouvez trouver à peu près exactement en exécutant un peu similaire de Bash à ce que Git fonctionnera en interne quand il crée le fichier pack pour pousser:

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

Ce devrait afficher le nombre d'octets du paquet fichier Git enverrait. Ventilées:

# 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 

Ceci est conditionnel à faire un git fetch juste avant pousser; Si vous ne le faites pas, Git ne pourra pas trouver l'ancêtre commun et enverra le contenu de votre dépôt entier. Voir this answer pour plus d'informations.

Questions connexes