Kararsız bir bağlantıda büyük bir proje için bir git klonu nasıl tamamlanır?


193

Ben LibreOffice kod temeli klon git çalışıyorum, ama şu anda yaklaşık 300kbps bir internet bağlantısı var ve bu sadece istikrarlı ama başka bir şey. Bağlantıyı her an geri alabilirim, ama sonra git klonlama işlemi zaten çalışmayı durdurdu ve tekrar çalıştırmanın bir yolu yok. Arızaya karşı daha dayanıklı bir git klonu indirmenin bir yolu var mı?

Kendimi düşündüğüm bir seçenek, bir başkasının .git dizinini indirmektir, ancak bu diğerlerine aşırı derecede bağımlıdır ve benim için mümkün olan en iyi çözüm gibi görünmemektedir.


6
Tüm revizyonları klonlamanız mı gerekiyor yoksa en yeni mi? Belki depth -1bir çözümdür?
takeshin

1
Paket yaklaşımı, benzer depolar için zaten uygulanmaktadır kernel/git/torvalds/linux.git. Ve devam ettirilebilir bir git klonu tartışılıyor (Mart 2016). Bkz. Stackoverflow.com/a/29192890/6309 .
VonC

Merak ediyorum. Yapmayacak git init, uzaktan kumandayı ayarlayacak ve hile yapmayı başarana kadar getirme yapmayacak mısınız? Bağlantı başarısız olursa getirme başarıyla indirilen nesneleri alamaz.
Андрей Беньковский

@ АндрейБеньковский kimse bunu denedi mi?
William Entriken

Yanıtlar:


71

Bunun henüz hazır olduğunu düşünmüyorum. Orada eski bir GSoC sayfa istediğiniz özelliği uygulamak planlanan söyledi. Benim en iyi bahis, bir dizin olarak indirmeyi önerdiğiniz gibi. Diğer protokoller üzerinden indirmeye devam edebileceğinizi varsayıyorum.

Yeniden Başlatılabilir Klon

Büyük bir havuzu (KDE, Open Office, Linux çekirdeği gibi) klonlarken, şu anda kesintiye uğramış bir klonu yeniden başlatmanın bir yolu yoktur. Küçük bir borunun ucundaki bir kullanıcının verileri indirmesi uzun sürebilir ve klon ortada kesilirse, kullanıcının şu anda baştan başlayıp tekrar denemesi gerekir. Bazı kullanıcılar için bu büyük bir deponun klonlanmasını imkansız hale getirebilir.

Hedef: Git-clone uygulamasının yerel git: // protokolü üzerinden daha önce başarısız olan bir indirmeyi otomatik olarak sürdürmesine izin verin. Dil: C Moderatör: Shawn Pearce Önerilen: Shawn Pearce on gmane


Güncelleme

git clone --depth=1Diğer cevaplardan birinde yer alan sığ klonlama ( ) önerisinin yanı sıra , sağlayıcıyla iletişim kurabiliyorsanız birinin sizin için çıplak bir depo hazırlayabilmesi yararlı olabilir. Çıplak depoyu tam bir depoya kolayca dönüştürebilirsiniz . Ayrıca, sığ bir klonun her zaman yardımcı olmayabileceği için bu cevaptaki yorumları okuyun.


Bilgi için teşekkürler, bu yüzden sorunum biliniyor ve bir çözüm üzerinde çalışılıyor ... Çözüm olarak ne önerirsiniz?
LaPingvino

9
Dün, 600 rupi (10 $) kaybettim bu problem yüzünden. İnternet bant genişliği dünyanın bir parçası oldukça değerli bir şey.
Amit Singh Tomar

2
Birçok kişi güncelleme istiyor ve çözüme katkılarını paylaşan kimse yok.
William Entriken

2
Mar'18 - bunun için lukin ... bu dünyada !!
dünyalı

3
11 yıl sonra, Google'ın Google Fiber ve Google Fi ile güvenilir olmayan bant genişliği altında yatan sosyoekonomik konuya yönelik saldırısı karışık sonuçlar verdi. Louisville şehrindeki fiber mikro çukurları asfaltın içine çok sığ kesilmiş ve kablolar işten kısa bir süre sonra yol yüzeyinden dışarı çıkarken bulundu. Bu arada --depth 1ve --unshallowkullanım yıllarına dayanmış gibi görünüyor.
rwong

126

Akla gelen iki çözüm (veya daha doğrusu geçici çözümler ) şunlardır:

  • Sığ klon kullanın git clone --depth=1, yani artan N ile bu klonu derinleştirin . Kalan tüm düzeltmeleri indirmek için (1.8.0.3'ten beri) kullanabilirsiniz.git fetch --depth=Ngit fetch --unshallow

  • Birinden etiketli bir sürüme kadar paketlemesini isteyin ( git-bundle (1) kılavuzuna bakın). Paketin kendisi, özgeçmiş desteğiyle HTTP / FTP, BitTorrent, rsync, vb. Aracılığıyla herhangi bir şekilde indirebileceğiniz sıradan bir dosyadır. Paketten klon oluşturabilir, yapılandırmayı düzeltebilir ve resmi LibreOffice deposundan daha fazla getirme yapabilirsiniz .


3
Sığ klon hile pratikte iyi çalışmıyor. İyi paketlenmiş bir repoyu klonlamak (git: //libvirt.org/libvirt.git) 68M aktarımını 61M + 35M aktarımına dönüştürür. Derinlik 1'deki tüm dallar yerine çalışma ağacını önceliklendirme özelliği daha iyi olabilir; oturumun yeniden başlaması daha iyi olurdu.
Tobu

1
@ Tobu: Sığ klon hile lonG geçmişi olan depoda çalışabilir. Sığ klonun varsayılan olarak yalnızca tek bir dal almasını sağlamak için devam eden çalışmalar vardır. Bu yardımcı olabilirdi. Ya da değil.
Jakub Narębski

6
Git 1.7.10 ile bu gerçekten iyi çalışıyor . Git deposunun başlangıç ​​derinliği = 1 klonu yalnızca 4.72Mb, tüm depo 55Mb'dir. Daha fazla getirme istediğiniz kadar küçük olabilir, (derinlik = 100 bana ~ 20Mb getirmişti). Toplam sıkıştırılmış indirme 31MB, bir klon ve 3 getirme üzerinde.
naught101

2
@ naught101 Bir revizyon için nesneleri indirir ve kaynak kodun kendisi büyükse (tarih değil), yine bir sorun olacaktır ...
kan

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];donebenim için çalıştı, teşekkürler! :)
Trass3r

15

Bu yöntem üçüncü taraf sunucusu kullanır.

Önce yapın, git clone --baresonra rsync -v -P -e ssh user@host:repo.git . Windows altında msys kullanabilirsiniz.


--Bare seçeneğini denedim, repo.git içindeki .git iç dosyalarının beklenen içeriğini oluşturdu, gerçek depoyu almak için git klon dosyasını yapmak zorunda kaldım: ///path/to/repo.git/
PiyusG

1
Linus , "3. taraf sunucu" ile GitHub'a sahip değil mi? Aslında " rsync(1) GitHub sana baktığım sırada kullanımını yasaklayacak kadar kullanıcılarını hapse atmayan Git sunucusu" mu demek istediniz ? Veya, birinciye demek git clone üzerine 3. taraf sunucusu ve daha sonra yerel makineye bunu rsync?
JamesTheAwesomeDude


9

"Başkasının .git dizinini" indirebilirsiniz, ancak bununla birlikte başka birinin resmi veri havuzu kendisi olabilir. LibreOffice depoları örneğin onların http yoluyla ulaşılabilir build.gitolan http://anongit.freedesktop.org/git/libreoffice/build.git/ (bkz http://cgit.freedesktop.org/libreoffice/ , tam liste için http URL, her bir deponun sayfasının altındadır).

Bu http URL'lerinde gördüğünüz şey bir dizinden başka bir şey değildir .git(aslında sadece .gitdizinde bulacağınız bir "çıplak" veri havuzu ). git://Protokol ( git daemon) sunucusunun okuyacağı dizinle aynıdır . Bu dizinlerin bir kopyasını bir web indiricisiyle (örneğin wget -m -np) kopyalarsanız, kopyanızdan klonlayabilirsiniz ve doğrudan http deposundan klonlanmış olmanız gibi çalışacaktır.

Yani, yapabileceğiniz şey: her depo için, en sevdiğiniz web indiricinizle bir kopyasını alın (bu, kırık indirmelere devam etmekle ilgili tüm sorunlarla ilgilenecektir) ve bu kopyadan klonlayın. Güncellemek istediğinizde, kopyanızı güncellemek için tekrar favori web indiricinizi kullanın ve bu kopyadan çekin. Artık klonlarınız ve güncellemeleriniz en sevdiğiniz web indiriciniz kadar kötü bağlantılara karşı dayanıklıdır.


Şu anda sadece bir depoya dönüşüm gerçekleştirdiler, ipucunuzu denemek siteyi hemen indirmeye karar veriyor ancak ... (şimdi tekrar denemek, muhtemelen daha sonra burada güncellenecek ...)
LaPingvino

Komutunuz sitedeki tüm bağlantıları alıyor gibi görünüyor, ki bu olması gereken şey değil. Burada çalışıyor gibi görünen bir senaryo yazmak için başvurdum: gist.github.com/1307703 Her neyse, ilk fikir için çok teşekkürler!
LaPingvino

İlginç bir fikir, yakut / yakut deposunu github'dan almaya çalışıyorum ve robots.txt tarafından engelleniyorum ... herhangi bir öneriniz var mı?
hanetzer

6

Hadi mola git clone's elemanlarına kadar, ve kullanım git checkoutyeniden indirerek dosyaları engellemek için.

Çalıştığında git clone, yaptığı ilk birkaç şey eşdeğerdir

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

Yukarıdaki adımları manuel olarak çalıştırırsanız ve doğru bir şekilde tamamlandıklarını varsayarsanız, artık aşağıdakileri gerektiği kadar çalıştırabilirsiniz:

git checkout --force <branch>

Her çalıştırıldığında tüm dosyaları teslim alacağını, ancak dosyaları yeniden indirmeniz gerekmeyeceğini unutmayın ; bu da size zaman kazandırabilir.


1
tarif ettiğiniz şekilde çalışmaz, kırık bir
getirmeden

Dediğim gibi, getirme işleminin başarıyla tamamlandığını varsaydığınızda, git reset komutunu çalıştırabilirsiniz. Getirmeniz bozulursa sıfırlama çalışmaz. A) çalışana kadar tekrar tekrar almaya çalışmanız veya B) bunu terk etmeniz ve başka bir şey denemeniz gerekir.
cowlinator

Mucizevi çalıştığım başka bir şey yaptım. Git fetch =) yerine bir git pull yaptım
MaikoID

@MaikoID Ben bir git çekme sadece git fetch dahili olarak çağırıyor inanıyorum, ve sonra birleştirir, bu yüzden komut fark
yaratmış

4

3. taraf bir sunucuya erişiminiz varsa, orada klonlayıp kopyalayabilirsiniz.


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

Bu komut bana yardım et ( Nicola Paolucci sayesinde )

Örneğin

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

4

Klon / derinlik tabanlı cevaplar üzerine inşa - birkaç satır bash bunu kolayca yapar ...

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


Teşekkürler, işe yarıyor gibi görünüyor, Arduino'yu klonlamaya çalışıyorum, yaklaşık 800MB ile% 25'ti ve çöktü. kısımlarda indirmek daha güvenli gibi görünüyor, ancak 1 adımda olması gerekmeyebilir, belki 10 veya 50 daha iyidir, nasıl güncelleneceğine bağlı olarak, 80 bin dosya hayal edin, çok az derinlikte yazılmamalıdır. Kullanarak: m in için seq 1 10 1000; git git --depth = $ m; 10 adımda yapılır. PS Ctrl + CI yaparsam sadece geçerli paketi kaybederim ve tekrar başlayabilirim
user3394963

3

Bu sorun beni de ısırdı. Benim durumumda bir çözüm var. Sizin durumunuz için geçerli olabilir veya olmayabilir.

Bazen uzak bir sistemde git işlemlerini başlatmak için bir cep telefonu kullanıyorum. Benim wi-fi elbette kırılırsa oturum sona erer ve git iyileşmeden tüm klon işlemi düşer. Ama uzaktaki sistemimden git master'a internet bağlantısı sağlam olduğundan klonun durmasına gerek yok. Tek ihtiyacım olan klon terminal oturumundan ayırmak için sağduyu. Bu, screen / tmux veya nohup / daemon kullanılarak yapılabilir. Yani benim durumumda bir yaşam hatası.



2

Klonlamayı durdurmak için CNTRL Z kullanın. Terminali kapatmayın, sistemi / dizüstü bilgisayarı hazırda bekletme moduna alın ve daha sonra fg komutuyla devam edin. Bugün aynı sorunla karşı karşıya kalırken bir repo frm github'u klonlamaya çalışıyordum. Bu benim için zaman kazandırdı.


2

Arabellek boyutunu artırmak bu problemde size yardımcı olacaktır. Sadece adımları takip et.

adımlar:

1. Terminal veya Git Bash'i açın ve "cd" ile repo'yu kopyalamak istediğiniz yere gidin.

2. sıkıştırmayı 0 olarak ayarlayın

git config --global core.compression 0

3. set sonrası tampon boyutu

git config --global http.postBuffer 1048576000

4. maxRequestBuffer boyutunu ayarlama

git config --global http.maxRequestBuffer 100M

5. şimdi başlangıç ​​klonu

git clone <repo url>

6. klon tamamlanana kadar bekleyin.

Teşekkür ederim. Mutlu Kodlama !!!


Bu kesinlikle kabul edilen cevap olmalıdır. Sorunu çözer.
SuperEye

1

5 sentimi buraya koymak istiyorum. Aslında bu sorunu çözmemde bana yardımcı oldu

  • sıkıştırmayı kapat
  • http.postBuffer'ı artır
  • kısmi bir klon yap
  • klonlanan dizine gidin ve klonun geri kalanını getirin
  • gerisini çek
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

Bu 8Mbps adsl bağlantısı üzerinden ~ 3GB repo klonlamak için bana yardımcı oldu, tabii ki getirme yapmak zorunda kaldı ve birkaç kez çekti, ama yine de ...


0

sunucunun bant çapında iyi olduğunu varsayarsak (ve bir sunucunuz varsa) başka bir yanıt:

  1. Sunucu Tarafı kullanarak kendi sunucu oluşturmak Git sarıcı 's
  2. sunucunuzda kopyalayın
  3. O sunucu-tarafı kullanarak Zip Archiver Zip 's
  4. Sunucu Tarafı Özgeçmiş desteğinden ve bununla indir

ancak bu yalnızca çok temel Web geliştirme deneyimiyle çalışır;) ve ayrıca git.exesunucunuzda


0

Burada aynı sorun - Sık sık 10-15 kb / sn ile gerçekten kesintili bir internet bağlantım var :-P

Benim için wget yolu çok iyi çalıştı. Yeşil düğmenin "klonla veya indir" olduğu depo sitesine gidin, tıklayın ve ZIP indirme seçeneğinin bağlantısını kopyalayın.

Ardından wget komutunun bağlantısını ekleyin:
wget -c -m -np https://github.com/your/repository/archive/master.zip

Tıkır tıkır çalışıyor...


0

benim için çalışan en iyi geçici çözüm:

kötü bir internet bağlantısı ile aynı sorunla karşı karşıya. Bu yüzden aşağıdaki çözümü buldum:

Paketi zip dosyası olarak indirmek için sunucumda küçük bir php dosyası oluşturuldu:

<?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>

ardından özgeçmişi destekleyen herhangi bir indirme yöneticisini kullanarak zip dosyasını indirin


-1

Mercurial'ı hg-git uzantısıyla kullanmayı deneyebilirsiniz.

Bu işe yaramazsa git fetch <commit-id>, uzak git deposunun yalnızca bölümlerini almak için kullanabilirsiniz (boş bir git deposuna getirebilirsiniz, klonla oluşturmanıza gerek yoktur). Ancak bu yaklaşımı kullandığınızda şube yapılandırmasını (= yerel ve uzak izleme dalları oluştur) düzeltebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.