Как определить, сколько данных загрузит git pull? - PullRequest
0 голосов
/ 03 июня 2018

Предположим, что я использую дорогой тарифный план для своего мобильного телефона через точку доступа, и я плачу за МБ.

Есть ли способ проверить, сколько данных нужно загрузить git, если я выдаю git pull?(Без загрузки это очевидно)

1 Ответ

0 голосов
/ 03 июня 2018

Краткий ответ - «нет».Длинный ответ «возможно», но вам понадобится какая-то вспомогательная система.

Обратите внимание, что git pull это просто git fetch, за которым следует вторая команда Git.Вторая команда выполняется локально и не вызывает передачи данных - все передачи происходят в течение git fetch.Таким образом, вопрос на самом деле: сколько данных будет git fetch передавать?Ответ зависит от того, что находится в вашем Git-репозитории, что находится в их Git-репозитории, о чем вы говорите Git-запросу, и насколько хорошо их сжатие.

При извлечении можно использовать либо тупой протокол, либоумный протокол .Основное отличие состоит в том, что с тупым протоколом вы часто не получаете никакой выгоды от того, что уже загрузили: например, если у другого Git есть все в файле гигантского пакета, вы должны повторно загрузить весь файл гигантского пакета.Как правило, это будет серьезно ужасно для вашего случая использования.К счастью, практически все вместо этого используют интеллектуальный протокол.

На странице книги Pro Git, на которую я ссылался выше, дается краткое описание интеллектуального протокола, но не вдаваться в подробности (по веским причинам - я опущу многокровавой детали, а также).Краткая версия, тем не менее, заключается в том, что ваш Git и их Git будут говорить о хешах коммитов, но не будут углубляться в хеши деревьев и блобов: ваш Git скажет им, какие хеши коммитов хочет ваш Git, а какие - у вашего Git.Говоря своим Git, что ваш Git имеет , коммит с хэш-идентификатором X сообщает своему Git, что ваш Git имеет не только сам X, но и всех его предков. 1 Затем их Git может сделать вывод, чтовам нужны коммиты, которые являются потомками X, но не X и не его предками.

Из этого их Git может сделать вывод, что вы имеете не только коммит X и его предков, но такжелюбые деревья и капли, которые появляются в X и его предках.(См. Аргумент --objects-edge для git rev-list.) Это позволяет их Git создать thin pack , который дельта-сжимает каждый объект не только против других объектов в пакете, но также и любых объектов, которые вы ужеИмеется в виду, что у вас есть фиксация X и его предков.

Если игнорировать все данные, передаваемые по интеллектуальному протоколу, то большая часть полученных вами данных будет получаться в виде тонкого пакета.Но единственный способ определить размер тонкой пачки - использовать другую Git build тонкую пачку.

Достаточно легко представить стороннее ПО, которое выВы можете вставить в этот процесс: вы бы запустили git fetch, указав вашему Git связаться со сторонним программным обеспечением, которое вы запускаете на средней машине, расположенной там, где вы не платите байтом.Это стороннее программное обеспечение передавало бы диалог между двумя Git-ами, чтобы их Git собрал тонкий пакет.Затем, вместо отправки тонкой упаковки, ваша сторонняя прокладка будет хранить тонкую упаковку на средней машине.Затем по некоторому боковому каналу средняя машина сообщает вам размер.Вы решаете, принять ли стоимость передачи тонкого пакета или нет;это определяет, завершится ли выборка успешно или не получится с жалобой на то, что удаленный (действительно ваша программа-шим) неожиданно закрывает соединение.


1 Это игнорирует мелкий хранилища, которые все усложняют.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...