Ответ 1
Нет, git операции clone/fetch/pull не имеют возможности "возобновить".
Единственная альтернатива упомянутая в этом потоке, gitolite (это perl script управление ACM - уровень контроля доступа для вашего репо, а также предоставление других утилит вокруг доступа git)
gitolite может быть настроен для обновления пакета Git (см.
git-bundle
manual), который затем может быть загружен через rsync или HTTP, а затем его можно загрузить с помощью клиента rsync HTTP-клиент, который поддерживает возобновление.Используя эту технику, вы можете сделать шаги "загрузить все" и "сделать репо из загруженного материала", и первый шаг можно выполнить с помощью любого количества попыток.
Недостатки очевидны:
- Для этого требуется специальная настройка на стороне сервера.
- Непонятно, что произойдет, если кому-то удастся обновить репозиторий когда кто-то загружает свой пакет, или происходит обновление между смежными попытками загрузки.
Что касается возобновляемой функции git clone
/fetch
(упоминается в Как завершить клон git для большого проекта при нестабильном подключении? "), есть недавняя дискуссия (март 2016 года) в git список рассылки.
- Один из подходов состоит в том, что сервер создает пакеты, которые могут быть загружены (с использованием возобновления с помощью
wget -c
!) и добавлены в локальное репо (поскольку пакет - это один файл, с которого вы можете клонировать, как если бы он был git repo).
См. "Клонирование Linux из пакета "
То есть:
wget -c https://cdn.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/clone.bundle
git bundle verify clone.bundle
...
clone.bundle is okay
git clone clone.bundle linux
#Now, point the origin to the live git repository and get the latest changes:
cd linux
git remote remove origin
git remote add origin https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git pull origin master
- Другим подходом является фактическая реализация возобновляемого
git clone
, обсуждаемого в этом потоке li >
Мы могли бы реализовать возобновляемый клон, сделав немного гибрида интеллектуальный и немой HTTP-протокол.
A
git clone
в конечном итоге вызывает транспортный уровень иgit-remote-curl
будет определять URL-адрес info/clone; если ресурс не загружается, все проходит через традиционную кодировку.Когда
git-remote-curl
обнаруживает поддержку немого клона, он выполняет "повторите попытку, чтобы успешно загрузить данные пакета полностью" внутренне, предварительно обновляет удаленные ссылки для отслеживания, а затем делает вид, будто его попросили сделать инкрементную выборку. Если это преуспевает без каких-либоdie()
, все счастливы.Если вышеприведенный шаг 3. по какой-либо причине должен
die()
(в том числе нетерпение, поражающее CTRL C), оставьте$GIT_DIR
, загрузили файл.info
и частично загрузили файл.pack
.
Сообщите пользователю, что клонирование можно возобновить и как.
Обратите внимание, что это для возобновляемого клона, не возобновляемая выборка:
начальный "клон" и последующая инкрементная "выборка" являются ортогональными проблемами.
Поскольку предлагаемое обновление для "клона" имеет гораздо больший выигрыш, чем предлагаемое изменение "выборки", т.е.
- Количество передаваемых данных намного больше, следовательно вероятность выхода из строя сети в плохой сетевой среде намного выше, потребность в возобновлении намного больше.
- Не только подход делает "клон" возобновляемым и помогающим клиентов, он помогает серверу выгружать массовую передачу на CDN.
и имеет гораздо меньший урон существующему коду, т.е.
- Нам не нужно пессимизировать процесс упаковки, только чтобы отказаться большая часть байтов, которые были сгенерированы, как и предлагаемый подход для "выборки".
- Требуется новый код области, который хорошо изолирован, а переключатель в новый протокол происходит очень рано в обмене без обмена код в существующую кодировку; эти свойства делают его менее рискованным ввести регрессию.
Чтобы избежать использования только HTTP-протокола в новом протоколе, есть предложение для протокола "v2", который позволит обеим сторонам обмениваться возможностями перед рекламой ref. Затем клиент, увидев возобновляемый URL-адрес сервера, знает, следует ли продолжать рекламу.
См. stefanbeller/gitprotocol2-10
который подходит для захватов.