Как выполнить git-клон для большого проекта на нестабильном соединении? - PullRequest
174 голосов
/ 17 октября 2010

Я пытаюсь скопировать кодовую базу LibreOffice, но на данный момент у меня есть интернет-соединение со скоростью около 300 кбит / с, и оно стабильно.Я могу восстановить соединение в любой момент, но затем процесс git clone уже перестал работать, и я не смог запустить его снова.Есть ли какой-нибудь способ получить более устойчивую к сбоям загрузку git-клона?

Один из вариантов, который я считал для себя, - это скачивание чужого каталога .git, но он чрезмерно зависит от других и не кажется лучшимвозможное решение для меня.

Ответы [ 16 ]

111 голосов
/ 18 октября 2010

Два решения (или, скорее, обходные пути ), которые приходят на ум:

  • Используйте неглубокий клон , то есть git clone --depth=1, затем углубление этого клона, используя git fetch --depth=N, с увеличением N . Вы можете использовать git fetch --unshallow (начиная с 1.8.0.3) для загрузки всех оставшихся ревизий.

  • Попросите кого-нибудь bundle до какой-либо помеченной версии (см. git-bundle (1) manpage). Сам пакет представляет собой обычный файл, который вы можете загрузить любым способом, через HTTP / FTP с поддержкой возобновления, через BitTorrent, через rsync и т. Д. Вы можете создать клон из пакета, исправить конфигурацию и делать дальнейшие выборки из официального репозитория LibreOffice. .

65 голосов
/ 17 октября 2010

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

Перезапускаемый клон

При клонировании большого хранилища (такого как KDE, Open Office, ядро ​​Linux) в настоящее времянет способа перезапустить прерванный клон.Пользователю на конце небольшого канала может потребоваться значительное время для загрузки данных, и если клон прерывается в середине, пользователю в настоящее время необходимо начать сначала и повторить попытку.Для некоторых пользователей это может сделать невозможным клонирование большого репозитория.

Цель: разрешить git-clone автоматически возобновить ранее неудачную загрузку по собственному протоколу git: //.Язык: C Наставник: Шон Пирс Предложено: Шон Пирс на gmane


Обновление

Наряду с предложением мелкого клонирования (git clone --depth=1) в одном из других ответовможет быть полезно, если кто-то может сделать для вас пустой репозиторий, если вы сможете общаться с провайдером.Вы можете легко конвертировать пустой репозиторий в полный репозиторий.Также прочитайте комментарии в этом ответе, так как мелкий клон не всегда помогает.

13 голосов
/ 25 сентября 2012

Этот метод использует сторонний сервер.

Сначала сделай git clone --bare, тогда rsync -v -P -e ssh user@host:repo.git . Вы можете использовать msys под Windows.

9 голосов
/ 13 июня 2011

Вы можете «скачать чужой каталог .git», но с этим другим человеком, который сам является официальным репозиторием. Репозитории LibreOffice доступны через http, например, их build.git находится по адресу http://anongit.freedesktop.org/git/libreoffice/build.git/ (полный список см. http://cgit.freedesktop.org/libreoffice/, URL-адрес http находится внизу страницы каждого репозитория).

То, что вы видите по этим http-URL-адресам, представляет собой не что иное, как каталог .git (на самом деле «пустой» репозиторий, в котором есть только то, что вы найдете в каталоге .git). Это тот же каталог, который должен прочитать сервер для протокола git:// (git daemon). Если вы создаете копию этих каталогов с помощью веб-загрузчика (например, wget -m -np), вы можете клонировать из своей копии, и она будет работать так же, как если бы вы клонировали непосредственно из хранилища http.

Итак, вы можете сделать следующее: для каждого репозитория получить его копию с помощью вашего любимого веб-загрузчика (который решит все проблемы с возобновлением прерванных загрузок) и клонировать из этой копии. Если вы хотите обновить, снова используйте ваш любимый веб-загрузчик, чтобы обновить свою копию, и извлеките ее. Теперь ваши клоны и обновления так же устойчивы к плохим соединениям, как ваш любимый веб-загрузчик.

8 голосов
/ 13 ноября 2013

" Никогда не стоит недооценивать полосу пропускания почтового голубя и пачки карт SD ", - это современная форма этого ответа. Подбери это, просто старое cp -a это, что угодно, и пошлите эту чертову вещь по почте. Найдите кого-то, кто готов потратить две минуты своего времени, чтобы вставить флэш-накопитель в SASE. Найдите там контакт, они могут даже сделать это для вас.

5 голосов
/ 08 сентября 2017

Давайте разберем git clone на его составные части и используем git reset для предотвращения повторной загрузки файлов.

Когда запускается git clone, первые несколько вещей, которые он делает, эквивалентны

git init
git remote add origin <repo_url>
git fetch origin <branch>

Если вы выполнили вышеупомянутые шаги вручную и при условии, что они выполнены правильно, теперь вы можете выполнить следующее столько раз, сколько необходимо:

git checkout --force <branch>

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

4 голосов
/ 21 октября 2014
git clone --depth <Number> <repository> --branch <branch name> --single-branch

Эта команда поможет мне (спасибо Никола Паолуччи )

например

git clone --depth 1 https://github.com/gokhanmoral/siyahkernel3 --branch ics  --single-branch
4 голосов
/ 17 октября 2010

Если у вас есть доступ к стороннему серверу, вы можете тут же клонировать, а затем скопировать.

3 голосов
/ 14 июля 2012

Эта проблема меня и укусила.В моем случае есть обходной путь.Это может или не может применяться в вашем случае.

Я иногда использую мобильный телефон для запуска операций git на удаленной системе.Если мой wi-fi сломается, конечно, сессия заканчивается, и git удаляет всю операцию клона без восстановления.Но так как интернет-соединение от моей удаленной системы до мастера git является надежным, нет необходимости останавливать клон.Все, что мне нужно, это здравый смысл, чтобы отделить клон от терминальной сессии.Это можно сделать с помощью screen / tmux или nohup / daemon.Так что в моем случае это сбой liveware.

2 голосов
/ 26 ноября 2014

Опираясь на ответы, основанные на клоне / глубине - несколько строк bash делают это легко ...

git clone --depth=1 something@somegit.com:/var/git/whatever.git <directory> cd <directory> for m in `seq 1 100`;do git fetch --depth=$m;done

...