Jak ukończyć klon git dla dużego projektu przy niestabilnym połączeniu?


193

Próbuję sklonować bazę kodu LibreOffice, ale w tej chwili mam połączenie internetowe o prędkości około 300 kb / s, ale jest stabilne. Mogę odzyskać połączenie w dowolnym momencie, ale potem proces klonowania git już przestał działać i nie ma sposobu, aby przywrócić go ponownie. Czy istnieje sposób na bardziej odporne na awarie pobieranie klonowania git?

Jedną z opcji, którą uważałem za siebie, jest pobranie katalogu innej osoby .git, ale jest to w dużym stopniu zależne od innych i nie wydaje mi się to najlepszym możliwym rozwiązaniem.


6
Czy chcesz sklonować wszystkie wersje, czy tylko najnowsze? Może depth -1jest rozwiązanie?
bierze

1
Podejście pakietowe jest już stosowane w przypadku transakcji typu repo kernel/git/torvalds/linux.git. Dyskutowany jest wznawiający klon git (marzec 2016 r.). Zobacz stackoverflow.com/a/29192890/6309 .
VCC

Zastanawiam się. Nie zrobisz git init, ustawiając pilota, a następnie wykonując pobieranie, dopóki się nie uda. Nie sądzę, aby pobieranie odrzuciło pomyślnie pobrane obiekty, jeśli połączenie nie powiedzie się.
Андрей Беньковский

@ АндрейБеньковский próbował ktoś to?
William Entriken

Odpowiedzi:


71

Nie sądzę, żeby to było jeszcze gotowe. Istnieje stara strona GSoC , która planowała zaimplementować pożądaną funkcję. Mój najlepszy zakład to, tak jak sugerowałeś, pobierz go jako katalog. Zakładam, że możesz wznowić pobieranie przy użyciu innych protokołów.

Klon do ponownego uruchomienia

Podczas klonowania dużego repozytorium (takiego jak KDE, Open Office, jądro Linuksa) obecnie nie ma możliwości ponownego uruchomienia przerwanego klonowania. Pobranie danych przez użytkownika na końcu małej rurki może zająć dużo czasu, a jeśli klon zostanie przerwany w środku, użytkownik musi zacząć od nowa od początku i spróbować ponownie. Dla niektórych użytkowników może to uniemożliwić klonowanie dużego repozytorium.

Cel: Pozwól git-clone automatycznie wznowić poprzednio nieudane pobieranie przez natywny protokół git: //. Język: C Mentor: Shawn Pearce Sugerowany przez: Shawn Pearce na gmane


Aktualizacja

Wraz z git clone --depth=1sugestią płytkiego klonowania ( ) w jednej z pozostałych odpowiedzi może być pomocne, jeśli ktoś może stworzyć dla ciebie puste repozytorium, jeśli możesz komunikować się z dostawcą. Możesz łatwo przekonwertować samo repozytorium na pełne. Przeczytaj także komentarze w tej odpowiedzi, ponieważ płytki klon nie zawsze może pomóc.


Dzięki za informację, więc mój problem jest znany i opracowywane jest rozwiązanie ... Co byś polecił jako obejście?
LaPingvino

9
Właśnie wczoraj straciłem 600 rupii (10 USD) z powodu tego problemu. Internet Bandwidth jest dość cenną rzeczą w mojej części świata.
Amit Singh Tomar

2
Wiele osób prosi o aktualizacje i nikt nie dzieli się swoim wkładem w rozwiązanie.
William Entriken

2
Mar'18 - łaknienie za to wciąż ... na tej ziemi !!
Ziemianin

3
11 lat później atak Google'a na leżącą u podstaw społeczno-ekonomicznego problemu niewiarygodną przepustowość za pomocą Google Fiber i Google Fi przyniósł mieszane wyniki. Jego mikroskopy z włókien w mieście Louisville zostały zbyt płytko przycięte do asfaltu, a kable wyskoczyły z powierzchni drogi wkrótce po pracy. W międzyczasie, --depth 1i --unshallowwydaje się, że wytrzymał latach użytkowania.
rwong

126

Dwa przychodzące na myśl rozwiązania (a raczej obejścia ):

  • Zastosowanie płytkie klon znaczy git clone --depth=1, następnie pogłębić ten klon korzystania git fetch --depth=N, wraz ze wzrostem N . Możesz użyć git fetch --unshallow(od 1.8.0.3), aby pobrać wszystkie pozostałe wersje.

  • Poproś kogoś o dołączenie do niektórych oznaczonych wersji (patrz strona git-bundle (1) ). Sam pakiet jest zwykłym plikiem, który można pobrać w dowolny sposób, przez HTTP / FTP z obsługą wznowienia, przez BitTorrent, przez rsync itp. Możesz utworzyć klon z pakietu, naprawić konfigurację i wykonywać dalsze pobrania z oficjalnego repozytorium LibreOffice .


3
Sztuczka płytkiego klonowania nie działa dobrze w praktyce. Klonowanie dobrze zapakowanego repozytorium (git: //libvirt.org/libvirt.git) zmienia transfer 68M na transfer 61M + 35M. Funkcja ustalania priorytetów dla drzewa roboczego, a nie wszystkich gałęzi na głębokości 1, może wyglądać lepiej; wznowienie sesji byłoby jeszcze lepsze.
Tobu

1
@Tobu: Sztuczka z płytkim klonowaniem może działać w repozytorium z historią lonG. Trwają prace nad domyślnym spłyceniem klonowania tylko jednego oddziału. To mogło pomóc. Albo nie.
Jakub Narębski,

6
Działa to naprawdę dobrze , z git 1.7.10. Początkowa głębokość = 1 klon repozytorium Git to tylko 4,72 Mb, podczas gdy całe repozytorium to 55 Mb. Dalsze pobrania mogą być tak małe, jak chcesz, (głębokość = 100 dała mi pobranie ~ 20 Mb). Całkowity skompresowany plik do pobrania wynosił 31 Mb, ponad jeden klon i 3 pobrania.
naught101

2
@ naught101 Pobiera obiekty dla jednej wersji, a jeśli sam kod źródłowy jest duży (nie historia), to będzie to znowu problem ...
kan

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];donepracował dla mnie, dzięki! :)
Trass3r

15

Ta metoda wykorzystuje serwer innej firmy.

Najpierw wykonaj git clone --bare, a następnie rsync -v -P -e ssh user@host:repo.git . Możesz użyć msys w systemie Windows.


Próbowałem --bare opcja, utworzyła oczekiwaną zawartość wewnętrznych plików .git wewnątrz repo.git, musiałem zrobić plik klonowania git: ///path/to/repo.git/, aby uzyskać rzeczywiste repozytorium
PiyusG

1
Linus nie jest właścicielem GitHub … przez „serwer innej firmy”, czy rzeczywiście miałeś na myśli „serwer Git, który nie uwięził swoich użytkowników tak mocno, że zabronił ich używania rsync(1) przez sposób, w jaki GitHub na ciebie patrzy ”? A może chcesz najpierw git clone na serwerze innej firmy, a następnie zsynchronizować go z komputerem lokalnym?
JamesTheAwesomeDude


9

Możesz „pobrać katalog .git innej osoby”, ale ta osoba jest oficjalnym repozytorium. Repozytoria LibreOffice są dostępne za pośrednictwem http, na przykład build.gitpod adresem http://anongit.freedesktop.org/git/libreoffice/build.git/ (patrz http://cgit.freedesktop.org/libreoffice/ pełna lista , adres URL http znajduje się na dole strony każdego repozytorium).

To, co widzisz w tych adresach URL HTTP, to nic innego jak .gitkatalog (w rzeczywistości „puste” repozytorium, które zawiera tylko to, co znajdziesz w .gitkatalogu). Jest to ten sam katalog, który czytałby serwer dla git://protokołu ( git daemon). Jeśli wykonasz kopię tych katalogów za pomocą narzędzia do pobierania z Internetu (na przykładwget -m -np ), możesz sklonować z kopii i będzie działać tak samo, jakby sklonowano bezpośrednio z repozytorium http.

Możesz więc: dla każdego repozytorium uzyskać jego kopię za pomocą swojego ulubionego programu do pobierania z Internetu (który poradzi sobie ze wszystkimi problemami z wznowieniem niedziałających pobrań) i sklonować z tej kopii. Kiedy chcesz zaktualizować, użyj ponownie swojego ulubionego programu do pobierania stron internetowych, aby zaktualizować kopię, i pobierz ją z tej kopii. Teraz Twoje klony i aktualizacje są tak samo odporne na złe połączenia, jak Twój ulubiony program do pobierania plików z Internetu.


Dokonali konwersji do tylko jednego repozytorium teraz, próbując wget wskazówka postanawia pobrać witrynę na raz jednak ... (ponowna próba teraz, prawdopodobnie zaktualizuje się tutaj później ...)
LaPingvino 08.08.11

Twoje polecenie wydaje się uzyskać wszystkie linki na stronie, co nie jest tym, co ma się wydarzyć. Postanowiłem napisać skrypt, który wydaje się tutaj działać: gist.github.com/1307703 W każdym razie, wielkie dzięki za pomysł!
LaPingvino

Ciekawy pomysł, staram się uzyskać repozytorium ruby ​​/ ruby ​​z github i blokuje mnie plik robots.txt ... jakieś sugestie?
hanetzer

6

Podzielmy na git cloneczęści składowe i użyj, git checkoutaby zapobiec ponownemu pobieraniu plików.

Po git cloneuruchomieniu pierwsze kilka rzeczy, które robi, są równoważne

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

Jeśli uruchomisz powyższe kroki ręcznie i przy założeniu, że zostały one wykonane poprawnie, możesz teraz uruchomić następującą liczbę razy:

git checkout --force <branch>

Pamiętaj, że będzie kasował wszystkie pliki przy każdym uruchomieniu, ale nie będziesz musiał ponownie pobierać plików , co może zaoszczędzić mnóstwo czasu.


1
nie działa tak, jak to opisujesz, nie pozwoli na zresetowanie git po zepsutym pobieraniu
opisujesz MaikoID

Tak jak powiedziałem, gdy tylko założysz, że pobieranie zakończyło się pomyślnie, możesz uruchomić git reset. Jeśli pobieranie jest zepsute, reset nie zadziała. Musisz albo A) wielokrotnie próbować pobrać ponownie, aż zadziała, albo B) porzucić to i spróbować czegoś innego.
cowlinator

Zrobiłem coś innego, co zadziałało cudownie. Zrobiłem ściągnięcie git zamiast git fetch =)
MaikoID

@MaikoID Uważam, że ściągnięcie git po prostu wywołuje git fetch wewnętrznie, a następnie łączy się, więc polecenie powinno mieć znaczenie
lucidbrot

4

Jeśli masz dostęp do serwera innej firmy, możesz go sklonować, a następnie skopiować.


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

To polecenie pomóżcie mi (dzięki Nicola Paolucci )

na przykład

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

4

Opierając się na odpowiedziach opartych na klonie / głębokości - kilka linii basha robi to łatwo ...

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


Dzięki, wygląda na to, że działa, próbuję sklonować Arduino, było na poziomie 25% z około 800 MB i uległo awarii. pobieranie w częściach wydaje się być bezpieczniejsze, ale może nie musi być wykonywane w krokach co 1, być może 10 lub 50 jest lepsze, w zależności od tego, jak jest aktualizowany, wyobraź sobie, że 80 tysięcy plików nie powinno być zapisywanych w tak małej głębokości. Używanie: for m in seq 1 10 1000; do git pull --depth = $ m; done, aby uzyskać kroki 10. PS Jeśli zrobię Ctrl + CI, stracę tylko bieżący pakiet i mogę zacząć od nowa
user3394963

3

Ten problem też mnie ugryzł. W moim przypadku istnieje obejście. To może, ale nie musi mieć zastosowania w twoim przypadku.

Czasami używam telefonu komórkowego do inicjowania operacji git na zdalnym systemie. Jeśli moje wi-fi zepsuje, oczywiście sesja się kończy i git porzuca całą operację klonowania bez odzyskiwania. Ale ponieważ połączenie internetowe między moim zdalnym systemem a git master jest stałe, klon nie musi się zatrzymywać. Potrzebuję tylko zdrowego rozsądku, aby odłączyć klon od sesji terminalowej. Można to zrobić za pomocą screen / tmux lub nohup / daemon. Więc w moim przypadku jest to awaria oprogramowania na żywo.



2

Użyj CNTRL Z, aby zatrzymać klonowanie. Nie zamykaj terminala, przełącz system / laptop w stan hibernacji, a następnie kontynuuj komendą fg. Napotkałem dzisiaj ten sam problem, próbując sklonować repozytorium github z repo. To przyniosło mi oszczędność czasu.


2

Zwiększenie rozmiaru bufora pomoże ci w tym problemie. Postępuj zgodnie z instrukcjami.

kroki:

1. Otwórz terminal lub Git Bash i za pomocą „cd” przejdź do lokalizacji, w której chcesz sklonować repozytorium.

2. Ustaw kompresję na 0

git config --global core.compression 0

3. Ustaw rozmiar postBuffer

git config --global http.postBuffer 1048576000

4.Ustaw rozmiar maxRequestBuffer

git config --global http.maxRequestBuffer 100M

5. Teraz rozpocznij klonowanie

git clone <repo url>

6. Poczekaj, aż klon się skompletuje.

Dziękuję Ci. Happy Coding !!!


To zdecydowanie powinna być zaakceptowana odpowiedź. To rozwiązuje problem.
SuperEye

1

Chciałbym tu umieścić moje 5 centów. Właśnie to pomogło mi rozwiązać ten problem

  • wyłącz kompresję
  • zwiększ http.postBuffer
  • wykonać częściowy klon
  • przejdź do sklonowanego katalogu i pobierz resztę klonu
  • pociągnij resztę
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

Pomogło mi to w sklonowaniu ~ 3 GB repozytorium na połączenie adsl 8 Mb / s, oczywiście musiałem kilka razy pobierać i pobierać, ale nadal ...


0

jeśli założymy, że serwer ma dobre pasmo (a ty masz serwer), inną odpowiedzią jest:

  1. stworzyć swój własny serwer używając po stronie serwera git wrapper „s
  2. sklonuj go na swoim serwerze
  3. Zip go za pomocą strony serwera Zip Archiver S”
  4. pobierz go zi ze wsparciem CV po stronie serwera

ale działa to tylko przy bardzo podstawowych doświadczeniach związanych z tworzeniem stron internetowych;), a także potrzebujesz git.exew swoim serwerze


0

Ten sam problem tutaj - mam naprawdę niestabilne połączenie internetowe z często nie więcej niż 10-15 kb / s :-P

Dla mnie sposób wget działał bardzo dobrze. Przejdź do strony repozytorium, w której znajduje się zielony przycisk „klonuj lub pobierz”, kliknij go i skopiuj link opcji pobierania ZIP.

Następnie wstaw link do polecenia
wget : wget -c -m -np https://github.com/your/repository/archive/master.zip

Działa jak marzenie...


0

najlepsze obejście, które dla mnie zadziałało:

napotkałem ten sam problem ze złym połączeniem internetowym. Więc wymyśliłem następujące rozwiązanie:

Utworzyłem mały plik php na moim serwerze, aby pobrać pakiet jako plik 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>

następnie pobierz plik zip za pomocą dowolnego menedżera pobierania, który obsługuje wznawianie


-1

Możesz spróbować użyć rtęci z rozszerzeniem hg-git.

Jeśli to nie zadziała, możesz użyć git fetch <commit-id>do pobrania tylko części zdalnego repozytorium git (możesz pobrać do pustego repozytorium git, nie ma potrzeby tworzenia go za pomocą klonowania). Ale możesz poprawić konfigurację gałęzi (= utworzyć lokalne i zdalne gałęzie śledzenia), korzystając z tego podejścia.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.