अस्थिर कनेक्शन पर एक बड़ी परियोजना के लिए गिट क्लोन कैसे पूरा करें?


193

मैं लिब्रे ऑफिस कोडबेस को क्लोन करने की कोशिश कर रहा हूं, लेकिन फिलहाल मेरे पास लगभग 300 केबीपीएस का इंटरनेट कनेक्शन है और यह सिर्फ कुछ भी है लेकिन स्थिर है। मुझे किसी भी क्षण कनेक्शन वापस मिल सकता है, लेकिन फिर गिट क्लोन प्रक्रिया पहले से ही काम करना बंद कर देती है, और इसे फिर से चलाने का कोई तरीका नहीं है। क्या कोई तरीका है कि अधिक विफलता-प्रतिरोधी गिट क्लोन डाउनलोड हो?

एक विकल्प जो मैंने खुद माना कि किसी और की। निर्देशिका को डाउनलोड करना है, लेकिन यह दूसरों पर निर्भर है और मेरे लिए सबसे अच्छा संभव समाधान नहीं लगता है।


6
क्या आपको सभी संशोधनों को क्लोन करने की आवश्यकता है, या सिर्फ नवीनतम? शायद depth -1एक समाधान है?
ताकेशिन

1
बंडल दृष्टिकोण पहले से ही रिपॉजिट के लिए जगह में है kernel/git/torvalds/linux.git। और एक फिर से शुरू करने योग्य गिट क्लोन की चर्चा की जा रही है (मार्च 2016)। देखें stackoverflow.com/a/29192890/6309
VonC

मैं सोचता हूं। git initजब तक यह सफल नहीं हो जाता, तब तक एक रिमोट सेट करना और फिर करना नहीं पड़ेगा ? मुझे नहीं लगता कि यदि कनेक्शन विफल हो जाता है, तो सफलतापूर्वक डाउनलोड की गई डिस्क को लाने के लिए।
Андрей Беньковский

@ АндрейБеньковский किसी ने भी यह कोशिश की है?
विलियम एंट्रीकेन

जवाबों:


71

मुझे नहीं लगता कि यह अभी तक तैयार है। नहीं है एक पुरानी GSoC पेज कि जो अपने वांछित सुविधा को लागू करने की योजना बनाई। मेरी सबसे अच्छी शर्त है, जैसे आपने सुझाव दिया कि इसे एक निर्देशिका के रूप में डाउनलोड करें। मुझे लगता है कि आप अन्य प्रोटोकॉल पर डाउनलोड फिर से शुरू करने में सक्षम हैं।

रिस्टार्टेबल क्लोन

जब एक बड़ी रिपॉजिटरी (जैसे केडीई, ओपन ऑफिस, लिनक्स कर्नेल) का क्लोन किया जाता है, तो वर्तमान में एक बाधा क्लोन को पुनरारंभ करने का कोई तरीका नहीं है। उपयोगकर्ता को डेटा डाउनलोड करने के लिए एक छोटे से पाइप के अंत में काफी समय लग सकता है, और यदि क्लोन बीच में बाधित हो जाता है तो उपयोगकर्ता को वर्तमान में शुरुआत से शुरू करने और फिर से प्रयास करने की आवश्यकता होती है। कुछ उपयोगकर्ताओं के लिए यह एक बड़े भंडार को क्लोन करना असंभव बना सकता है।

लक्ष्य: git-क्लोन को देशी git: // प्रोटोकॉल पर पहले से विफल डाउनलोड को फिर से शुरू करने की अनुमति दें। भाषा: सी मेंटर: शॉन पीयर्स द्वारा सुझाए गए: गमन पर शॉन पीयर्स


अपडेट करें

उथले क्लोनिंग ( git clone --depth=1) सुझाव के साथ अन्य उत्तरों में से एक में यह उपयोगी हो सकता है अगर कोई आपके लिए नंगे भंडार कर सकता है यदि आप प्रदाता के साथ संवाद कर सकते हैं। आप आसानी से नंगे भंडार को पूर्ण भंडार में बदल सकते हैं । उस उत्तर में टिप्पणियों को भी पढ़ें क्योंकि उथले क्लोन हमेशा मदद नहीं कर सकते हैं।


जानकारी के लिए धन्यवाद, इसलिए मेरी समस्या ज्ञात है और एक समाधान पर काम किया गया है ... आप एक काम के रूप में क्या सुझाएंगे?
लाफिंग्विनो

9
ठीक है कल, मैंने इस समस्या के कारण अपने 600 रुपये ($ 10) खो दिए। Internet Bandwidth मेरे दुनिया के हिस्से में काफी कीमती चीज है।
अमित सिंह तोमर

2
बहुत से लोग अपडेट के लिए पूछ रहे हैं और समाधान में उनके योगदान को साझा नहीं कर रहे हैं।
विलियम एंट्रीकेन

2
Mar'18 - लुकिन इसके लिए अभी भी ... इस धरती पर !!
earthling

3
11 साल बाद, Google फाइबर और Google Fi के साथ अविश्वसनीय बैंडविड्थ के अंतर्निहित सामाजिक आर्थिक मुद्दे पर Google के हमले के मिश्रित परिणाम थे। लुइसविले शहर में इसकी फाइबर माइक्रो-खाइयों को डामर में बहुत अधिक काट दिया गया था, और केबल काम के तुरंत बाद सड़क की सतह से बाहर निकलते पाए गए थे। इस बीच, --depth 1और --unshallowउपयोग के वर्षों को पीछे छोड़ दिया है।
रवांग

126

दो समाधान (या बल्कि वर्कअराउंड ) जो दिमाग में आते हैं:

  • उपयोग उथले क्लोन यानी git clone --depth=1, तो गहरा उपयोग करते हुए इस क्लोन git fetch --depth=N, में वृद्धि के साथ एन । आप git fetch --unshallowसभी शेष संशोधनों को डाउनलोड करने के लिए (1.8.0.3 के बाद से) का उपयोग कर सकते हैं ।

  • किसी को कुछ टैग किए गए रिलीज़ तक बंडल करने के लिए कहें (देखें git-bundle (1) manpage)। बंडल अपने आप में एक साधारण फ़ाइल है, जिसे आप किसी भी तरह से डाउनलोड कर सकते हैं, HTTP / FTP के माध्यम से फिर से शुरू समर्थन के माध्यम से, BitTorrent के माध्यम से, rsync के माध्यम से, आदि। आप बंडल से क्लोन बना सकते हैं, कॉन्फ़िगरेशन ठीक कर सकते हैं, और आधिकारिक लेटरऑफिस रिपॉजिटरी से आगे के भ्रूण कर सकते हैं। ।


3
उथले क्लोन चाल व्यवहार में अच्छी तरह से काम नहीं करता है। अच्छी तरह से पैक किए गए रेपो (git: //libvirt.org/libvirt.git) का क्लोनिंग 68 एम ट्रांसफर को 61 एम + 35 एम ट्रांसफर में बदल देता है। 1 की गहराई पर सभी शाखाओं के बजाय, वर्कट्री को प्राथमिकता देने की सुविधा बेहतर हो सकती है; सत्र की बहाली अभी भी बेहतर होगी।
तोबू

1
@ टोबू: लल्लू इतिहास के साथ भंडार की चाल में काम कर सकता है। उथले क्लोन को डिफ़ॉल्ट रूप से केवल एक शाखा प्राप्त करने के लिए काम चल रहा है। कि मदद की हो सकती है। या नहीं।
जकुब नारबस्की 15

6
जीआईटी 1.7.10 के साथ अब यह वास्तव में अच्छी तरह से काम करता है । आरंभिक गहराई = गिट रिपॉजिटरी का 1 क्लोन केवल 4.72Mb है, जबकि संपूर्ण रिपॉजिटरी 55Mb है। आगे के रूप में आप चाहते हैं के रूप में छोटे हो सकते हैं, (गहराई = 100 ने मुझे एक ~ 20 एमबी भ्रूण दिया)। कुल संपीडित डाउनलोड 31Mb था, एक क्लोन पर और 3 भ्रूण थे।
n

2
@ naught101 यह एक संशोधन के लिए ऑब्जेक्ट डाउनलोड करता है, और यदि स्रोत कोड ही बड़ा है (इतिहास नहीं), तो यह फिर से एक मुद्दा होगा ...
kan

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];doneमेरे लिए काम किया, धन्यवाद! :)
ट्रैस

15

यह विधि 3rd पार्टी सर्वर का उपयोग करती है।

सबसे पहले, करो git clone --bare, फिर rsync -v -P -e ssh user@host:repo.git . आप विंडोज के तहत msys का उपयोग कर सकते हैं।


मैं --bare विकल्प की कोशिश की, यह repo.git अंदर .git आंतरिक फ़ाइलों की उम्मीद सामग्री बनाया है, मैं Git क्लोन फ़ाइल करना था: वास्तविक भंडार पाने के लिए ///path/to/repo.git/
PiyusG

1
लाइनस "3-पार्टी सर्वर" द्वारा गीथहब ... का मालिक नहीं है , क्या वास्तव में आपका मतलब "गिट सर्वर है जो अपने उपयोगकर्ताओं को इतनी भारी जेल नहीं देता rsync(1) है कि जिस तरह से मैं आपको देख रहा हूं, वैसे ही उनके उपयोग को प्रतिबंधित करने के लिए "? या, यदि आप पहले करने के लिए क्या मतलब है git clone पर एक 3-पक्ष सर्वर और उसके बाद स्थानीय मशीन यह rsync?
जेम्स दिवालीवूड

12

" कभी भी एक वाहक कबूतर और एसडी कार्ड के एक बंडल की बैंडविड्थ को कम मत समझो " इस उत्तर का आधुनिक रूप होगा। यह अप, सादा cp -aयह पुराना , जो कुछ भी, और लानत बात मेल। एक एसएएसई में एक अंगूठे ड्राइव को छोड़ने के लिए अपने समय के दो मिनट लेने के लिए तैयार किसी व्यक्ति को ढूंढें। एक संपर्क खोजें, वहाँ, वे आपके लिए भी कर सकते हैं।


9

आप "किसी और की। निर्देशिका को डाउनलोड कर सकते हैं", लेकिन इसके साथ ही किसी और का आधिकारिक भंडार भी होगा। लिब्रे ऑफिस खजाने, http माध्यम से उपलब्ध हैं उदाहरण के लिए उनके build.gitपर है http://anongit.freedesktop.org/git/libreoffice/build.git/ (देखें http://cgit.freedesktop.org/libreoffice/ पूरी सूची के लिए, http URL प्रत्येक रिपॉजिटरी के पेज पर सबसे नीचे है)।

आप इन http URL पर जो देखते हैं, वह एक .gitडायरेक्टरी (वास्तव में "नंगे" रिपॉजिटरी से ज्यादा कुछ नहीं है, जो केवल वही है जो आप .gitडायरेक्टरी में पाएंगे )। यह वही निर्देशिका है जो git://प्रोटोकॉल के लिए सर्वर ( git daemon) पढ़ेगी। यदि आप एक वेब डाउनलोडर (उदाहरण के लिए wget -m -np) के साथ इन निर्देशिकाओं की एक प्रति बनाते हैं , तो आप अपनी कॉपी से क्लोन कर सकते हैं और यह वैसे ही काम करेगा जैसे आपने http रिपॉजिटरी से सीधे क्लोन किया था।

तो, आप क्या कर सकते हैं: प्रत्येक रिपॉजिटरी के लिए, अपने पसंदीदा वेब डाउनलोडर के साथ इसकी एक प्रति प्राप्त करें (जो टूटे हुए डाउनलोड को फिर से शुरू करने के साथ सभी मुद्दों से निपटेंगे), और उस कॉपी से क्लोन करें। जब आप अपडेट करना चाहते हैं, तो अपनी कॉपी को अपडेट करने के लिए अपने पसंदीदा वेब डाउनलोडर का फिर से उपयोग करें, और उस कॉपी से खींचें। अब आपके क्लोन और अपडेट खराब कनेक्शन के लिए प्रतिरोधी हैं क्योंकि आपका पसंदीदा वेब डाउनलोडर है।


उन्होंने अब केवल एक रिपॉजिटरी में रूपांतरण कर दिया, अपने टिप wget को एक बार में साइट को डाउनलोड करने का निर्णय लेने की कोशिश कर रहा है ... (अब फिर से कोशिश कर रहा है, शायद बाद में यहां अपडेट करेगा ...)
LaPingvino

आपका आदेश साइट पर सभी लिंक प्राप्त करने के लिए लगता है, जो कि ऐसा नहीं है जो होने वाला है। मैंने एक स्क्रिप्ट लिखने का सहारा लिया, जो यहां काम करने लगती है: gist.github.com/1307703 वैसे भी, प्रारंभिक विचार के लिए बहुत बहुत धन्यवाद!
लाफिंग्विनो

दिलचस्प विचार है, मैं गितुब से माणिक / रूबी रेपो प्राप्त करने की कोशिश कर रहा हूं और मुझे 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 fetch के बजाय git
खींचा

@MaikoID मेरा मानना ​​है कि एक git पुल बस git लाने को आंतरिक रूप से बुला रहा है, और फिर विलीन हो जाता है, इसलिए कमांड को
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

क्लोन / डेप्थ बेस्ड आंसर की बिल्डिंग - बैश की कुछ लाइनें इसे आसानी से पूरा करती हैं ...

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 को क्लोन करने की कोशिश कर रहा हूं, यह लगभग 800 एमबी के साथ 25% पर था, और यह दुर्घटनाग्रस्त हो गया। भागों में डाउनलोड करना सुरक्षित लगता है, लेकिन 1 के चरणों में होने की आवश्यकता नहीं हो सकती है, शायद 10 या 50 बेहतर है, यह कैसे अद्यतन किया जाता है, इस पर निर्भर करता है, 80 हजार फ़ाइलों की कल्पना करें, इतनी कम गहराई में नहीं लिखा जाना चाहिए। का उपयोग करना: में के लिए seq 1 10 1000, पुल खींच - depth = $ m; 10. के चरणों को पाने के लिए किया। अगर मैं Ctrl + CI कर केवल मौजूदा पैकेज खोना, और मैं फिर से शुरू कर सकते हैं
user3394963

3

यह समस्या मुझे भी है। मेरे मामले में एक काम है। यह आपके मामले में लागू हो भी सकता है और नहीं भी।

मैं दूरस्थ प्रणाली पर गिट संचालन शुरू करने के लिए कभी-कभी एक मोबाइल फोन का उपयोग कर रहा हूं। अगर मेरी वाई-फाई का सत्र समाप्त हो जाता है और जीआईटी पूरी वसूली के बिना ठीक हो जाता है। लेकिन चूंकि मेरे रिमोट सिस्टम से गिट मास्टर तक इंटरनेट कनेक्शन ठोस है, इसलिए क्लोन को रोकने की कोई आवश्यकता नहीं है। टर्मिनल सत्र से क्लोन को अलग करने के लिए मुझे सभी की आवश्यकता है। यह स्क्रीन / tmux या nohup / डेमन का उपयोग करके किया जा सकता है। तो यह मेरे मामले में एक लाइववेयर की खराबी है।



2

क्लोनिंग को रोकने के लिए CNTRL Z का उपयोग करें। टर्मिनल को बंद न करें सिस्टम / लैपटॉप को हाइबरनेशन में रखें और फिर बाद में fg कमांड द्वारा जारी रखें। मैं आज एक ही समस्या का सामना कर रहा था, जबकि एक रेपो frm गितुब को क्लोन करने की कोशिश कर रहा था। यह मेरे लिए एक समय बचाने के रूप में आया था।


2

बफर का आकार बढ़ने से आपको इस समस्या में मदद मिलेगी। बस चरणों का पालन करें।

कदम:

1 .Open टर्मिनल या Git Bash और "cd" के साथ उस स्थान पर जाएं जहां आप रेपो का क्लोन बनाना चाहते थे।

2. सेट संपीड़न 0

git config --global core.compression 0

3. सेट PostBuffer आकार

git config --global http.postBuffer 1048576000

4. सेट maxRequestBuffer आकार

git config --global http.maxRequestBuffer 100M

5.अब शुरू क्लोन

git clone <repo url>

6. जब तक क्लोन पूरा नहीं हो जाता।

धन्यवाद। हैप्पी कोडिंग !!!


यह निश्चित रूप से स्वीकृत उत्तर होना चाहिए। यह समस्या का समाधान करता है।
सुपरएय

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

इससे मुझे 8Mbps adsl कनेक्शन पर ~ 3GB रेपो क्लोन करने में मदद मिली, निश्चित रूप से मुझे कुछ समय के लिए प्रदर्शन करना पड़ा और खींचना पड़ा, लेकिन फिर भी ...


0

यदि हम मानते हैं कि सर्वर का बैंड-वाइड अच्छा है (और आपके पास सर्वर है) तो एक और उत्तर है:

  1. का उपयोग कर सर्वर-साइड अपने सर्वर बनाने Git आवरण की
  2. इसे अपने सर्वर में क्लोन करें
  3. यह सर्वर-साइड का उपयोग कर पिन ज़िप archiver की
  4. सर्वर-साइड पुनरारंभ समर्थन से इसे डाउनलोड करें

लेकिन यह केवल बहुत ही बुनियादी वेब-विकास के अनुभव के साथ काम करता है;) और आपको git.exeअपने अलग होने की भी जरूरत है


0

यहाँ एक ही समस्या है - मैं अक्सर 10-15 केबी / सेकंड से अधिक नहीं के साथ एक बहुत परतदार इंटरनेट कनेक्शन है :-P

मेरे लिए wget way ने बहुत अच्छा काम किया। रिपॉजिटरी साइट पर जाएं जहां ग्रीन बटन "क्लोन या डाउनलोड" है, इसे क्लिक करें और ज़िप डाउनलोड विकल्प के लिंक को कॉपी करें।

फिर wget कमांड के लिए लिंक डालें:
wget -c -m -np https://github.com/your/repository/archive/master.zip

एक जादू की तरह काम करता है...


0

मेरे लिए सबसे अच्छा वर्कअराउंड:

मैंने खराब इंटरनेट कनेक्शन के साथ इसी मुद्दे का सामना किया। तो मैं निम्नलिखित समाधान के साथ आया:

एक ज़िप फ़ाइल के रूप में पैकेज डाउनलोड करने के लिए मेरे सर्वर पर एक छोटी सी php फ़ाइल बनाई गई:

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

फिर किसी भी डाउनलोड प्रबंधक का उपयोग करके ज़िप फ़ाइल डाउनलोड करें जो फिर से शुरू का समर्थन करता है


-1

आप hg-git एक्सटेंशन के साथ मर्क्यूरियल का उपयोग करने का प्रयास कर सकते हैं।

यदि वह काम नहीं करता है, तो आप git fetch <commit-id>एक दूरस्थ गिट रिपॉजिटरी के केवल हिस्सों को लाने के लिए उपयोग कर सकते हैं (आप एक खाली गिट रिपॉजिटरी में ला सकते हैं, क्लोन के साथ इसे बनाने की कोई आवश्यकता नहीं है)। जब आप इस दृष्टिकोण का उपयोग करते हैं तो आप शाखा विन्यास को सही कर सकते हैं (= स्थानीय और दूरस्थ ट्रैकिंग शाखाएँ बनाएँ)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.