Предсказать, сколько данных будет отправлено в git push - PullRequest
27 голосов
/ 15 ноября 2010

Иногда я подключаюсь к дорогостоящему Интернет-соединению и хотел бы знать (хотя бы приблизительно), сколько данных будет передано на пульт в git push.

Ответы [ 3 ]

29 голосов
/ 15 ноября 2010

На самом деле, я думаю, что мой комментарий достаточно понравился, чтобы опубликовать его как ответ!

Когда вы нажимаете, git создает пакет всех необходимых объектов и загружает его на удаленный компьютер.Это означает, что мы ищем способ предсказать размер упаковки.Поскольку пакеты сжимаются, это делает очень трудным делать что-либо на основе различий или размеров объектов;что мы действительно хотим сделать, так это просто посмотреть, насколько большим будет этот пакет.Было бы неплохо, если бы вы могли прервать пуш, сразу после того, как он скомпоновал пакет, и решили продолжить работу в зависимости от размера пакета, но я не думаю, что это возможно.Мое лучшее предположение - попытаться воссоздать пакет, который будет выдвинут, и проверить его.

Пакетный файл - это, в основном, пакет с информацией заголовка (посмотрите, если хотите, источник ).).Это означает, что это удобная фарфоровая команда, которая создаст файл с нужным вам размером.(Гораздо проще, чем пытаться использовать pack-objects вручную.) Используйте что-то вроде этого:

git bundle create foo.bundle ^origin/master master

Это даст вам комплект, содержащий все необходимое, чтобы добраться до мастера, учитывая, чтопульт дистанционного управления имеет origin / master - то же самое, что должно быть нажато git push origin master.Если у вас есть дополнительные ветви, которые вы будете продвигать, вы также можете прикрепить их;он просто принимает аргументы списка оборотов:

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

Просто проверьте размер созданного пакета;это должно быть почти эквивалентно тому, что вы в конечном итоге толкнете.Это означает, что вам придётся создавать пакет дважды (один раз с пакетом и один раз с толчком), но если это действительно большой толчок, который требует много времени для упаковки, это не должно бытьогромная проблема.

9 голосов
/ 15 ноября 2010

Вы можете точно узнать это, запустив бит Bash, аналогичный тому, который Git будет запускать внутри себя, когда создаст файл пакета для отправки:Git-файл отправит.Разбит:

# 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

Это зависит от выполнения git fetch прямо перед тем, как вы нажмете;если вы этого не сделаете, Git не сможет найти общего предка и отправит содержимое всего вашего хранилища.См. этот ответ для получения дополнительной информации.

2 голосов
/ 15 ноября 2010
git diff HEAD origin/master --stat
...