Есть ли способ разделить выборку Git на несколько более мелких выборок?

Мне нужно подключиться к нашему Git-серверу через VPN, чтобы получить изменения, а VPN-соединение довольно медленное (~ 200 кбит/с). Я пытаюсь получить изменения за несколько месяцев, но это 3 ГБ файлов, и VPN-соединение продолжает отключаться, прежде чем оно закончит получение всех изменений.

Мне интересно, есть ли способ вытащить только половину изменений за раз, чтобы я мог разделить их на 2 партии?

Я думаю, что он автоматически возобновится с того места, где он был прерван.

mkrieger1 18.12.2020 19:21

@ mkrieger1: к сожалению, нет, не будет.

torek 18.12.2020 19:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
2
2
235
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ключом к разделению большой выборки является то, что выборка приносит коммиты. Одна операция выборки либо завершается успешно, либо полностью завершается сбоем, если сетевое соединение обрывается посередине. Но, если ваш git fetch хочет внести, скажем, 16384 коммита, что принесет 3 ГБ данных, которые не сделают все сразу, вы можете разбить это:

  • Во-первых, внесите 8192 коммита, которые принесут 1,5 ГБ данных;
  • затем внесите оставшиеся 8192 коммита, которые принесут остальные 1,5 ГБ данных.

Если этого недостаточно, продолжайте разбивать коммиты на все более мелкие наборы коммитов.

Однако в этом плане есть один существенный недостаток. Если 16383 коммита приносят, скажем, 500 МБ файлов, то один из этих коммитов — 16384-й — приносит 2,5 ГБ файлов. Вы не можете сломать это.

Кроме того, вы все равно не сможете выбирать коммиты таким образом, так как многие серверы не позволят вам запустить git fetch по необработанному хэш-идентификатору. Два! В этом плане есть два больших недостатка... вставьте сюда скетч Монти Пайтона Испанская инквизиция.

Серьезно, если у вас есть правильный доступ, вы можете попросить кого-нибудь разместить имена веток или имена тегов для различных коммитов и таким образом разбить большой пакет коммитов. Это подводит вас к одному возможному серьезному недостатку.

Редактировать: Как отмечает jthill в комментарии, вы также можете работать с противоположным направлением: запустить git fetch с опцией --depth (--depth=1 пытается получить только последний коммит для каждого имени ветки, --depth=2 пытается получить последние два, и т. д). Затем вы можете запустить дополнительные операции выборки с помощью --deepen, и когда у вас будет достаточно, git fetch --unshallow получить все остальное. Это, вероятно, проще всего работать только с вашего конца.

В качестве альтернативы попросите кого-нибудь запустить git bundle и создать пакетный файл. Затем используйте перезапускаемый протокол передачи для отправки файла. Когда у вас есть весь файл, запустите git fetch против файла пакета. Пакетный файл просто разбивается git fetch на различные отдельные части:

  • агрегирование объектов, необходимых для передачи (эту часть выполняет git bundle);
  • передача бандл-файла (эту часть вы делаете сами); и
  • извлечение бандл-файла в коммиты (git fetch знает, как это сделать).

На StackOverflow есть куча вопросов и ответов о git bundle; см., например, Как использовать git-bundle для синхронизации разработки?

О, этот пакет git идеально подходит для будущего (всё это мучительно каждый раз, когда мы добавляем нового члена команды, и ему приходится извлекать файл с нуля). Но для этого первого решения я был бы готов рискнуть, так как я очень близок (например, 80-90%) до истечения времени ... так как бы я разделил его, как вы упомянули?

Adam L. 18.12.2020 20:19

@AdamL.: ну, сложная часть заключается в том, чтобы выяснить, какие коммиты git fetch извлекаются, а затем поместить ветку или имя тега в другой Git, чтобы вы могли git fetch origin <name> получить «первую половину» или «первые 10%» или что-то еще . Не существует идеального способа сделать это; лучше всего записать хэш-идентификаторы имен удаленного отслеживания в вашем Git, войти на другой компьютер (или иным образом получить к нему доступ) и запустить там git log в репозитории Git и посмотреть, какие коммиты у них есть, что вы не знаете.

torek 18.12.2020 21:32

@torek, могу я просто сделать выборку по хэш-идентификатору?

Adam L. 18.12.2020 21:35

Вы можете попробовать --depth=1 выборки и повторные --deepen= выборки...

jthill 19.12.2020 00:17

@AdamL: попробуй и увидишь! :) Это зависит от сервера.

LeGEC 19.12.2020 00:19

@jthill: о, точно, я совсем забыл о том, чтобы работать с ним с другого конца! Я должен отредактировать это в своем ответе. (и @ AdamL: вы можете попробовать, как сказал LeGEC, это зависит от сервера, позволяет ли он это)

torek 19.12.2020 01:22

Другие вопросы по теме