Як виконати клон git для великого проекту на нестабільному з'єднанні?


193

Я намагаюся git клонувати кодову базу LibreOffice, але на даний момент у мене є підключення до Інтернету близько 300 кбіт / с, і це просто все, але стабільне. Я можу повернути з'єднання в будь-який момент, але тоді процес клонування git вже перестав працювати, і жодного способу не запустити його знову. Чи є спосіб завантаження більш стійкого до відмови клона Git?

Я вважав себе одним із варіантів - завантажити чужий .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
Mar'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: фокус дрібного клонування може працювати в сховищі з історією lonG. Триває робота над тим, щоб неглибокий клон отримав лише одну гілку за замовчуванням. Це могло б допомогти. Чи ні.
Якуб Нарубський

6
Зараз це дуже добре працює , з git 1.7.10. Початкова глибина = 1 клон сховища Git становить лише 4,72 Мб, тоді як весь сховище - 55 Мб. Подальші вилучення можуть бути такими ж невеликими, як ви хочете, (глибина = 100 дала мені ~ 20 Мбіт). Загальна кількість стислих завантажень склала 31 Мбіт, за один клон та 3 вибори.
naught101

2
@ naught101 Він завантажує об’єкти за одну редакцію, і якщо вихідний код сам по собі великий (не історія), це буде знову проблема ...
кан

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: ///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/ , http-адреса знаходиться внизу сторінки кожного сховища).

Те, що ви бачите за цими URL-адресами http - це не що інше, як .gitкаталог (насправді "голе" сховище, у якому є лише те, що ви знайдете в .gitкаталозі). Це той самий каталог, який читав би сервер git://протоколу ( git daemon). Якщо ви робите копію цих каталогів за допомогою веб-завантажувача (наприклад wget -m -np), ви можете клонувати її копію, і вона буде працювати так само, як якщо б ви клонували безпосередньо з сховища http.

Отже, що ви можете зробити: це отримати для кожного сховища його копію улюбленим веб-завантажувачем (який вирішить усі проблеми з відновленням зламаних завантажень) та клонуйте з цієї копії. Коли ви хочете оновити, використовуйте знову свій улюблений завантажувач веб-сторінок, щоб оновити свою копію, і витягніть з неї копію. Тепер ваші клони та оновлення настільки ж стійкі до поганих зв’язків, як і ваш улюблений завантажувач веб-сторінок.


Вони зробили конверсію лише в один сховище, намагаючись ваш наконечник wget вирішить завантажити сайт одразу ж ... (спроба ще раз, можливо, оновиться тут пізніше ...)
LaPingvino

Здається, що ваша команда отримує всі посилання на сайті, а це не те, що має відбуватися. Я вдався написати сценарій, який, здається, працює тут: gist.github.com/1307703 У будь-якому випадку, велике спасибі за початкову ідею!
LaPingvino

Цікава ідея, я намагаюсь отримати ребіт рубіну / рубіну від 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. Якщо ви отримаєте помилку, скидання не працюватиме. Вам потрібно або A) кілька разів намагатися отримати знову, поки це не працює, або B) відмовитися від цього і спробувати щось інше.
ковбасник

Я робив щось інше, я це чудотворно працював. Я зробив тягу git замість git fetch =)
MaikoID

@MaikoID Я вважаю, що git pull - це просто виклик git fetch внутрішньо, а потім злиття, тому команда повинна не змінити значення
lucidbrot

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

Спираючись на клон / відповіді на глибину - кілька рядків бешти це легко робиться ...

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; do git pull --depth = $ m; робиться, щоб отримати кроки 10. PS Якщо я роблю Ctrl + CI, втрачаю лише поточний пакет, і я можу почати заново
користувач3394963

3

Ця проблема мене також вкусила. У моєму випадку є обробка. У вашому випадку це може бути, а може і не застосовуватися.

Я інколи використовую мобільний телефон, щоб ініціювати git-операції на віддаленій системі. Якщо мій Wi-Fi перерв, звичайно, сеанс закінчується, і git скасовує всю операцію клонування, не одужуючи. Але оскільки інтернет-зв'язок від моєї віддаленої системи до git master є твердим, клон не повинен зупинятися. Все, що мені потрібно, - це здоровий розум, щоб відірвати клон від термінального сеансу. Це можна зробити за допомогою екрана / tmux або nohup / daemon. Отже, в моєму випадку це несправність у програмному забезпеченні.



2

Використовуйте CNTRL Z для зупинки клонування. Не закривайте термінал, переводите систему / ноутбук у сплячку, а потім продовжуйте пізніше командою fg. Я зіткнувся з цією ж проблемою і сьогодні, намагаючись клонувати рето фріт-гітхуб. Це стало для мене економією часу.


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 Гб репо через 8 Мбіт / с, рекламне з'єднання, звичайно, мені довелося виконувати витяг і тягнути кілька разів, але все-таки ...


0

якщо ми припускаємо, що сервер має хороший діапазон (і у вас є сервер), ще одна відповідь:

  1. Створіть власний сервер за допомогою сервера Git Wrapper 's
  2. клонуйте його на своєму сервері
  3. Zip це з допомогою Server-Side Zip архіватор «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.