Мне нужно подключиться к нашему Git-серверу через VPN, чтобы получить изменения, а VPN-соединение довольно медленное (~ 200 кбит/с). Я пытаюсь получить изменения за несколько месяцев, но это 3 ГБ файлов, и VPN-соединение продолжает отключаться, прежде чем оно закончит получение всех изменений.
Мне интересно, есть ли способ вытащить только половину изменений за раз, чтобы я мог разделить их на 2 партии?
@ mkrieger1: к сожалению, нет, не будет.
Ключом к разделению большой выборки является то, что выборка приносит коммиты. Одна операция выборки либо завершается успешно, либо полностью завершается сбоем, если сетевое соединение обрывается посередине. Но, если ваш git fetch
хочет внести, скажем, 16384 коммита, что принесет 3 ГБ данных, которые не сделают все сразу, вы можете разбить это:
Если этого недостаточно, продолжайте разбивать коммиты на все более мелкие наборы коммитов.
Однако в этом плане есть один существенный недостаток. Если 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%) до истечения времени ... так как бы я разделил его, как вы упомянули?
@AdamL.: ну, сложная часть заключается в том, чтобы выяснить, какие коммиты git fetch
извлекаются, а затем поместить ветку или имя тега в другой Git, чтобы вы могли git fetch origin <name>
получить «первую половину» или «первые 10%» или что-то еще . Не существует идеального способа сделать это; лучше всего записать хэш-идентификаторы имен удаленного отслеживания в вашем Git, войти на другой компьютер (или иным образом получить к нему доступ) и запустить там git log
в репозитории Git и посмотреть, какие коммиты у них есть, что вы не знаете.
@torek, могу я просто сделать выборку по хэш-идентификатору?
Вы можете попробовать --depth=1
выборки и повторные --deepen=
выборки...
@AdamL: попробуй и увидишь! :) Это зависит от сервера.
@jthill: о, точно, я совсем забыл о том, чтобы работать с ним с другого конца! Я должен отредактировать это в своем ответе. (и @ AdamL: вы можете попробовать, как сказал LeGEC, это зависит от сервера, позволяет ли он это)
Я думаю, что он автоматически возобновится с того места, где он был прерван.