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


193

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

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


6
Вам нужно клонировать все ревизии или только последние? Может быть, depth -1есть решение?
принимает

1
Пакетный подход уже существует для репозиториев kernel/git/torvalds/linux.git. И обсуждается возобновляемый git-клон (март 2016 года). См. Stackoverflow.com/a/29192890/6309 .
VonC

Я думаю. Не git initсделаете, настройте пульт, а затем выполните выборку, пока он не преуспеет? Я не думаю, что выборка удаляет успешно загруженные объекты, если не удается установить соединение.
Андрей Беньковский

@ АндрейБеньковский кто-нибудь пробовал это?
Уильям Энтрикен

Ответы:


71

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

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

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

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


Обновить

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


Спасибо за информацию, поэтому моя проблема известна и решение найдено ... Что бы вы порекомендовали в качестве обходного пути?
LaPingvino

9
Ну, только вчера я потерял свои 600 рупий (10 долларов США) из-за этой проблемы. Пропускная способность интернета довольно ценная вещь в моей части мира.
Амит Сингх Томар

2
Многие люди просят обновления, и никто не делится своим вкладом в решение.
Уильям Энтрикен

2
Март 18 - Лукин за это еще ... на этой земле !!
землянин

3
11 лет спустя атака Google на основную социально-экономическую проблему ненадежной пропускной способности с помощью Google Fiber и Google Fi имела неоднозначные результаты. Его волоконные микро траншеи в городе Луисвилле были слишком неглубоко врезаны в асфальт, и вскоре после работы были обнаружены кабели, вырывающиеся с поверхности дороги. Между тем, --depth 1и, --unshallowкажется, выдержал годы использования.
rwong

126

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

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

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


3
Трюк с мелким клоном не очень хорошо работает на практике. Клонирование хорошо упакованного репо (git: //libvirt.org/libvirt.git) превращает передачу 68M в передачу 61M + 35M. Функция приоритезации рабочего дерева, а не всех ветвей на глубине 1, может быть лучше; возобновление сеанса было бы еще лучше.
Тобу

1
@Tobu: Мелкий трюк с клоном может работать в репозитории с длинной историей. Продолжается работа над тем, чтобы мелкий клон по умолчанию получал только одну ветвь. Это могло бы помочь. Или не.
Якуб Наребски

6
Теперь это работает очень хорошо , с git 1.7.10. Начальная глубина = 1 клон репозитория Git составляет всего 4,72 МБ, а всего хранилища - 55 МБ. Дальнейшие выборки могут быть настолько маленькими, насколько вы хотите (глубина = 100 дала мне ~ 20Mb выборки). Общий объем сжатой загрузки составил 31 МБ, более одного клона и 3 выборки.
naught101

2
@ naught101 Он загружает объекты для одной ревизии, и если сам исходный код большой (не история), то это снова будет проблемой ...
kan

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];doneработал на меня, спасибо! :)
Trass3r

15

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

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


Я попробовал параметр --bare, он создал ожидаемое содержимое внутренних файлов .git внутри repo.git, мне пришлось сделать файл git clone: ​​///path/to/repo.git/, чтобы получить реальный репозиторий
PiyusG

1
Линус не владеет GitHub … «сторонним сервером», вы действительно имели в виду «Git-сервер, который не так сильно сажает своих пользователей в тюрьму, чтобы запретить их использование rsync(1) , как я смотрю на вас GitHub »? Или вы имеете в виду сначала git clone на стороннем сервере, а затем rsync его на локальный компьютер?
JamesTheAwesomeDude

12

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


9

Вы можете «скачать чей-то каталог .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.

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


Они сделали преобразование только в один репозиторий, пытаясь, чтобы ваш совет wget решил загрузить сайт сразу, однако ... (
повторная

Кажется, ваша команда получает все ссылки на сайте, а это не то, что должно произойти. Я прибег к написанию сценария, который, кажется, работает здесь: gist.github.com/1307703 В любом случае, большое спасибо за первоначальную идею!
LaPingvino

Интересная идея, я пытаюсь получить репозиторий ruby ​​/ ruby ​​от github, и меня блокирует файл robots.txt ... есть предложения?
Hanetzer

6

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

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

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

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

git checkout --force <branch>

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


1
он не работает так, как вы описали, он не позволит выполнить git-сброс после
неправильной

Как я уже сказал, когда вы предполагаете, что выборка успешно завершена, вы можете запустить git reset. Если ваш выбор не работает, сброс не будет работать. Вам нужно либо A) повторно попытаться получить его снова, пока он не заработает, либо B) отказаться от этого и попробовать что-то еще.
cowlinator

Я сделал что-то еще, я этим чудесным образом работал. Я сделал git pull вместо git fetch =)
MaikoID

@MaikoID Я полагаю, что git pull - это просто внутренний вызов git fetch, а затем слияние, поэтому команда ned должна была что-то
изменить

4

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


4
git clone --depth <Number> <repository> --branch <branch name> --single-branch

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

например

git clone --depth 1 https://github.com/gokhanmoral/siyahkernel3 --branch ics  --single-branch

4

Опираясь на ответы на основе клонов / глубин - несколько строк 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


Спасибо, похоже, работает, я пытаюсь клонировать Arduino, он был на 25% с 800 МБ, и он потерпел крах. загрузка по частям кажется более безопасной, но, возможно, нет необходимости выполнять шаги с шагом 1, может быть, 10 или 50 лучше, в зависимости от того, как она обновляется, представьте, что 80 тысяч файлов не следует записывать с такой малой глубиной. Использование: для m in seq 1 10 1000; сделать git pull --depth = $ m; сделано, чтобы получить шаги 10. PS Если я
нажму

3

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

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



2

Используйте CNTRL Z, чтобы остановить клонирование. Не закрывайте терминал, переведите систему / ноутбук в спящий режим, а затем продолжите работу с помощью команды fg. Сегодня я столкнулся с той же проблемой, пытаясь клонировать репозиторий из github. Это стало для меня экономией времени.


2

Увеличение размера буфера поможет вам в этой проблеме. Просто следуйте инструкциям.

шаги:

1. Откройте терминал или Git Bash и с помощью «cd» перейдите в то место, где вы хотели клонировать репо.

2. Установить компрессию до 0

git config --global core.compression 0

3. Установите размер постбуфера

git config --global http.postBuffer 1048576000

4.Установите размер maxRequestBuffer

git config --global http.maxRequestBuffer 100M

5.Новый старт клона

git clone <repo url>

6. Дождитесь завершения клона.

Спасибо. Удачного кодирования !!!


Это определенно должен быть принятый ответ. Это решает проблему.
SuperEye

1

Я хотел бы поставить свои 5 центов здесь. Это на самом деле то, что помогло мне решить эту проблему

  • выключить сжатие
  • увеличить http.postBuffer
  • сделать частичный клон
  • перейдите в клонированный каталог и получите остальную часть клона
  • вытащить остальных
git config --global core.compression 0
git config --global https.postBuffer 524288000
git clone  <your_git_http_url_here> --depth 1
git fetch --unshallow 
git pull --all

Это помогло мне клонировать ~ 3ГБ репо через 8Mbps ADSL соединение, конечно, мне приходилось несколько раз выполнять выборку и извлечение, но все же ...


0

если мы предполагаем, что у сервера хорошая полоса пропускания (а у вас есть сервер), другой ответ:

  1. создать свой собственный сервер , используя Серверный Git обертка «S
  2. клонировать его на вашем сервере
  3. Zip это с помощью серверного Zip Archiver 's
  4. загрузите его с и с поддержкой возобновления на стороне сервера

но это работает только с очень базовым опытом веб-разработки;), а также вам нужно git.exeв вашем сервере


0

Та же проблема здесь - у меня очень слабое интернет-соединение, часто с частотой не более 10-15 кб / с :-P

Для меня способ wget работал очень хорошо. Перейдите на сайт репозитория, где находится зеленая кнопка «клонировать или скачать», кликните по ней и скопируйте ссылку опции загрузки ZIP.

Затем вставьте ссылку на команду wget:
wget -c -m -np https://github.com/your/repository/archive/master.zip

Работает как шарм ...


0

лучший обходной путь, который работал для меня:

Я столкнулся с той же проблемой с плохим подключением к Интернету. Итак, я пришел к следующему решению:

На моем сервере создан небольшой файл php для загрузки пакета в виде zip-файла:

<?php
$url = "https://codeload.github.com/CocoaPods/Specs/zip/master";
file_put_contents("coco.zip", fopen($url, 'r'));
?>  

<a href="coco.zip">coco.zip</a>

затем загрузите ZIP-файл, используя любой менеджер загрузок, который поддерживает резюме


-1

Вы можете попробовать использовать mercurial с расширением hg-git.

Если это не сработает, вы можете использовать git fetch <commit-id>для извлечения только части удаленного git-репозитория (вы можете извлечь в пустой git-репозиторий, нет необходимости создавать его с клоном). Но вы можете исправить конфигурацию веток (= создать локальные и удаленные ветки отслеживания) при использовании этого подхода.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.