क्या पहले संपूर्ण भंडार की जांच किए बिना विरल चेकआउट करना संभव है?


171

मैं बहुत बड़ी संख्या में फ़ाइलों के साथ एक रिपॉजिटरी के साथ काम कर रहा हूं जो चेकआउट करने में घंटों लगते हैं। मैं इस संभावना पर गौर कर रहा हूं कि क्या Git इस तरह के भंडार के साथ अब अच्छी तरह से काम करेगा कि यह विरल चेकआउट का समर्थन करता है, लेकिन हर उदाहरण जो मुझे मिल सकता है वह निम्नलिखित है:

git clone <path>
git config core.sparsecheckout true
echo <dir> > .git/info/sparse-checkout
git read-tree -m -u HEAD

इस क्रम के साथ समस्या यह है कि मूल क्लोन एक चेकआउट भी करता है। यदि आप मूल क्लोन कमांड में -n जोड़ते हैं, तो रीड-ट्री कमांड में निम्न त्रुटि होती है:

त्रुटि: विरल चेकआउट कार्यशील निर्देशिका पर कोई प्रविष्टि नहीं छोड़ता है

सबसे पहले सभी फाइलों को चेक किए बिना स्पार्स चेकआउट कैसे किया जा सकता है?



नोट: git 2.9 (जस्ट 2016) के साथ git worktree add --no-checkoutभी (सिर्फ नहीं git clone --no-checkout) काम करेगा । देखें नीचे मेरा उत्तर
VonC

यहां सभी समाधानों की कोशिश करने के बाद, केवल वही जो निर्देशिका को डाउनलोड करता है (बाद में कोई धक्का नहीं देता है!) यह है
लंदनरोब

जवाबों:


24

2020 में .ar फ़ाइलों की चिंता किए बिना विरल-चेकआउट से निपटने का एक सरल तरीका है। यहाँ देखें कि मैंने यह कैसे किया:

git clone <URL> --no-checkout <directory>
cd <directory>
git sparse-checkout init --cone # to fetch only root files
git sparse-checkout set apps/my_app libs/my_lib # etc, to list sub-folders to checkout
# they are checked out immediately after this command, no need to run git pull

ध्यान दें कि इसके लिए git संस्करण 2.25 इंस्टॉल होना चाहिए। इसके बारे में और अधिक पढ़ें: https://github.blog/2020-01-17-bring-your-monorepo-down-to-size-with-sparse-checkout/

अपडेट करें:

उपरोक्त git cloneकमांड अभी भी रेपो को उसके पूर्ण इतिहास के साथ सम्‍मिलित करेगा, हालांकि फाइलों की जांच किए बिना। आप पूरा इतिहास की जरूरत नहीं है, तो आप जोड़ सकते हैं --depth , आदेश के लिए पैरामीटर इस तरह:

# create a shallow clone,
# with only 1 (since depth equals 1) latest commit in history
git clone <URL> --no-checkout <directory> --depth 1

1
यह सच है, अच्छी बात है। Upvoted। मैंने stackoverflow.com/a/59515426/6309sparse-checkout --cone
VonC

--filterयहां अपने उत्तर में आंशिक क्लोन ( ) जोड़ने लायक होगा ।
ताओ

@ alexey-grinko, पहले कमांड को अभी भी पूरे रेपो को क्लोन करना था, भले ही उसने इसे चेक नहीं किया हो ... मैं सभी सामानों की क्लोनिंग नहीं करने के समय को बचाने के लिए देख रहा था जिनकी मुझे ज़रूरत नहीं है .. ।
mropp

1
@ मप्र, मैंने --depthपैरामीटर को जोड़कर उत्तर को अपडेट किया जो हमें उथले क्लोन करने की अनुमति देता है। क्या इससे मदद मिलेगी? @ ताओ, यकीन नहीं है कि --filterइस मामले में कैसे उपयोग किया जाए, मैंने इसकी कोशिश नहीं की। क्या आप एक उदाहरण प्रदान कर सकते हैं, या इस विषय पर एक और उत्तर दे सकते हैं?
एलेक्सी ग्रिंकरो

4
ध्यान दें कि यह 2.27 रिलीज़ में समान काम नहीं करता है - मुझे नहीं पता कि क्यों।
ब्लेज़्स

162

कृपया ध्यान दें कि यह उत्तर एक रिपॉजिटरी से डेटा की पूरी कॉपी डाउनलोड करता है। git remote add -fआदेश पूरे भंडार क्लोन होगा। के मैन पेज सेgit-remote :

-fविकल्प के साथ , git fetch <name>दूरस्थ जानकारी सेट करने के तुरंत बाद चलाया जाता है।


इसे इस्तेमाल करे:

mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add -f origin git://...
echo "path/within_repo/to/desired_subdir/*" > .git/info/sparse-checkout
git checkout [branchname] # ex: master

अब आप पाएंगे कि आपके पास "pruned" चेकआउट है, जिसमें केवल पथ / भीतर_सेपो / से / वांछित_सुबदिर (और उस पथ में) की फाइलें हैं।

ध्यान दें कि विंडोज़ कमांड लाइन पर आपको पथ को उद्धृत नहीं करना चाहिए, अर्थात आपको इस के साथ 6 वीं कमांड को बदलना होगा:

echo path/within_repo/to/desired_subdir/* > .git/info/sparse-checkout

यदि आपको स्पार्स-चेकआउट फ़ाइल में उद्धरण नहीं मिलते हैं, और यह काम नहीं करेगा


3
मैं कमांड "git चेकआउट [ब्रांचनाम]" का उपयोग नहीं कर सकता (यह भी त्रुटि पाया गया: स्पार्स चेकआउट निर्देशिका पर कोई प्रविष्टि नहीं छोड़ता है)। मैंने "गिट पुल ओरिजनल मास्टर" का उपयोग किया है और यह ठीक से काम करता है।
नेट्टी

2
लिनक्स पर git संस्करण 1.7.2.5 के साथ, मुझे निम्नलिखित परिणाम मिले: गूंज 'dir / *' केवल dir में फ़ाइलों की जाँच करता है / लेकिन इसके उपखंडों में नहीं; गूंज 'dir /' (नो एस्टेरिक्स!) सही ढंग से dir / के तहत पूरे पेड़ की जाँच करता है। HTH
pavek

37
यह सिर्फ सादा मेरे लिए काम नहीं करता था - "गिट रिमोट" कमांड के परिणामस्वरूप पूरे रेपो की जाँच की जा रही थी - बम! - ठीक है; इसलिए "git config ..." और निम्नलिखित आदेशों में ब्याज की एक उप-निर्देशिका के विनिर्देश का कोई प्रभाव नहीं था। क्या रेपो URL "git Remote" कमांड में निर्दिष्ट है जो शीर्ष-स्तर .git फ़ाइल का पथ है? या यह ब्याज के उप-डायर के लिए एक रास्ता होना चाहिए?
रोब क्रैनफिल

10
यहां एक सुव्यवस्थित संस्करण (मैन्युअल रूप से निर्देशिका बनाने की कोई आवश्यकता नहीं है, एक init और रिमोट ऐड कर रहा है, बस सामान्य git क्लोन + चेकआउट चक्र के साथ -no-checkout विकल्प के रूप में @onionjake द्वारा उल्लेख किया गया है): git clone -no-checkout <project> cd <project> echo <dir>> .it / info / sparse-checkout git चेकआउट <ब्रांच>
ग्रेगर

22
git remote addआदेश डाउनलोड सब कुछ है क्योंकि वो क्या है -fकरता है - बताता है इसे तुरंत, लाने के लिए इससे पहले कि आप विरल चेकआउट विकल्प परिभाषित किया है। लेकिन छोड़ने या पुन: व्यवस्थित करने में मदद करने वाला नहीं है। विरल चेकआउट केवल काम करने वाले पेड़ को प्रभावित करते हैं, न कि भंडार को। यदि आप चाहते हैं कि आपकी रिपॉजिटरी बदले में आहार पर जाए, तो आपको इसके बजाय विकल्पों --depthया --single-branchविकल्पों को देखना होगा।
मिरल

43

Git क्लोन में एक विकल्प ( --no-checkoutया -n) होता है जो आपको चाहिए।

आपके आदेशों की सूची में, बस बदलें:

git clone <path>

इसके लिए:

git clone --no-checkout <path>

फिर आप प्रश्न में बताए गए विरल चेकआउट का उपयोग कर सकते हैं।


7
हाँ, यह एक चेकआउट नहीं करता है, लेकिन फिर भी पूरे रेपो इतिहास को डाउनलोड करने के लिए एक फ़िंच करता है
जेसन एस

9
@JasonS प्रश्न विशेष रूप से चेकआउट न करने के बारे में था। यदि आप नहीं चाहते हैं, तो संपूर्ण इतिहास --depth <depth>गिट क्लोन पर विकल्प का उपयोग करें । यह केवल <depth>इतिहास से अंतिम रूप डाउनलोड करेगा । वर्तमान में गिट के साथ आंशिक रूप से एक ही कमिट डाउनलोड करने का कोई तरीका नहीं है, हालांकि यदि आपका रिमोट इसका समर्थन करता है तो आप git archive --remoteफ़ाइलों के आंशिक सेट को डाउनलोड करने के लिए उपयोग कर सकते हैं ।
प्याजजेक

अब आप vfsforgit.org का उपयोग करके किसी भी फाइल को डाउनलोड किए बिना एक कमिट को 'चेक आउट' भी कर सकते हैं । यह उपयोगी हो सकता है यदि कोई व्यक्ति केवल एक ही प्रतिबद्ध के एक छोटे उपसमूह की जांच करने की कोशिश कर रहा है।
प्याजजेक

22

मेरे पास एक समान उपयोग का मामला था, सिवाय इसके कि मैं केवल एक टैग के लिए प्रतिबद्ध जांच करना चाहता था और निर्देशिकाओं को prune करता था। उपयोग करने --depth 1से यह वास्तव में विरल हो जाता है और वास्तव में चीजों को गति दे सकता है।

mkdir myrepo
cd myrepo
git init
git config core.sparseCheckout true
git remote add origin <url>  # Note: no -f option
echo "path/within_repo/to/subdir/" > .git/info/sparse-checkout
git fetch --depth 1 origin tag <tagname>
git checkout <tagname>

3
-depth 1 को उथले क्लोन कहा जाता है, सिर्फ FYI करें।
मार्क एलीसन

1
इससे मदद मिली! धन्यवाद
kp123

1
इसके लिए धन्यवाद। पूरे रेपो को डाउनलोड करने से रोकने के लिए कई अन्य तरीकों की कोशिश करने के बाद इसके साथ सही मिला।
जे ... एस

12

मुझे वह उत्तर मिला जो मैं पहले वाले पोस्ट-लाइनर से देख रहा था, जो pavek (धन्यवाद!) द्वारा पोस्ट किया गया था, इसलिए मैं एक ही उत्तर में एक पूर्ण उत्तर देना चाहता था जो लिनक्स पर काम करता है (GIT 1.7.1):

1--> mkdir myrepo
2--> cd myrepo
3--> git init
4--> git config core.sparseCheckout true
5--> echo 'path/to/subdir/' > .git/info/sparse-checkout
6--> git remote add -f origin ssh://...
7--> git pull origin master

मैंने आदेशों के क्रम को थोड़ा बदल दिया है लेकिन इसका कोई असर नहीं दिख रहा है। कुंजी चरण 5 में पथ के अंत में ट्रेलिंग स्लैश "/" की उपस्थिति है ।


3
क्या आप सुनिश्चित हैं कि आप यही चाहते हैं? -f का मतलब है कि सभी डेटा प्राप्त करना, आप अभी भी अन्य सभी जानकारी प्राप्त करते हैं जो आप नहीं चाहते हैं और यह धीमा है। (यह अभी भी "संपूर्ण भंडार की जाँच कर रहा है")
शुमन

1
मैंने विंडोज़ में ऊपर दिए गए चरणों की कोशिश की लेकिन अतिरिक्त चेकआउट कमांड प्रॉम्प्ट में काम नहीं करता है इसलिए मैंने गिट बैश शेल की कोशिश की और यह काम कर गया। " कमांड प्रॉम्प्ट सभी git कमांड जैसे पुश, पुल इत्यादि को निष्पादित करने में सक्षम है, लेकिन जब यह विरल चेकआउट की बात आती है तो यह विफल हो जाता है।
user593029

उपनिर्देशिका की केवल फाइलें कैसे करें। मैं केवल विशिष्ट उप निर्देशिका के अंदर फाइलें लाना चाहता हूं।
बबीश श्रेष्ठ

@BabishShrestha onionjake की टिप्पणी को अन्य उत्तर पर देखें FWIW: |
रोज़गारपैक

9

अफसोस की बात है कि उपरोक्त में से कोई भी मेरे लिए काम नहीं करता था इसलिए मैंने sparse-checkoutफ़ाइल के विभिन्न संयोजन की कोशिश में बहुत लंबा समय बिताया ।

मेरे मामले में मैं IntelliJ IDEA कॉन्फ़िगर के साथ फ़ोल्डर्स को छोड़ना चाहता था।

मैंने जो किया था यह रहा:


Daud git clone https://github.com/myaccount/myrepo.git --no-checkout

Daud git config core.sparsecheckout true

.git\info\sparse-checkoutनिम्नलिखित सामग्री के साथ बनाया गया

!.idea/*
!.idea_modules/*
/*

सभी फ़ाइलों को प्राप्त करने के लिए 'git चेकआउट -' चलाएं।


यह काम करने के लिए महत्वपूर्ण बात /*फ़ोल्डर के नाम के बाद जोड़ना था ।

मेरे पास 1.9 है


3
नहीं, यह अभी भी सब कुछ, सभी कमिट और सभी फाइलों को डाउनलोड करता है, git 2.3.2
Tyguy7

6
विरल चेकआउट केवल काम करने वाले पेड़ को प्रभावित करते हैं। वे भंडार आकार को प्रभावित नहीं करते हैं या क्या प्राप्त होता है। यदि आप चाहते हैं कि आपको विभिन्न विकल्पों की आवश्यकता है।
मिरल

अगर अगली बार Windows में काम कर रहे हैं तो Git Bash Shell को आज़माएँ और 'pbetkier' द्वारा ऊपर दिए गए चरणों का उपयोग करें यह ठीक काम करता है
user593029

6

हां, संपूर्ण रिपॉजिटरी डाउनलोड करने के बजाय एक फ़ोल्डर डाउनलोड करना संभव है। यहां तक ​​कि किसी भी / अंतिम प्रतिबद्ध

ऐसा करने का अच्छा तरीका है

D:\Lab>git svn clone https://github.com/Qamar4P/LolAdapter.git/trunk/lol-adapter -r HEAD
  1. -r HEAD केवल अंतिम संशोधन को डाउनलोड करेगा, सभी इतिहास को अनदेखा करेगा।

  2. नोट ट्रंक और / विशिष्ट-फ़ोल्डर

पहले और बाद में URL को कॉपी और बदलें /trunk/। मुझे उम्मीद है कि यह किसी की मदद करेगा। का आनंद लें :)

26 सितंबर 2019 को अपडेट किया गया


केवल svn से आने वाले या उपयोग करने वालों के लिए लागू है। इस एक को अपवित्र नहीं करेंगे।
सी जॉनसन

@CJohnson जैसा कि आप देख सकते हैं, मैं git repo फ़ोल्डर क्लोन कर रहा हूं। ठीक काम
क़मर

1
ध्यान दें कि यह बॉक्स से बाहर कुछ git ऑफ़र नहीं है, लेकिन कुछ ऐसा है जो Git हब नियमित Git ऑफ़र के निकट है। हालांकि, यह सुंदर रूप से काम करता है जब आप इसका उपयोग कर सकते हैं। धन्यवाद!
Qix - मोनासा संबंधित था

1
एसओ पर असंख्य सुझावों में से, आपका सबसे संक्षिप्त और स्पष्ट समाधान है।
बोर्डर

4

git 2.9 (जून 2016) --no-checkoutविकल्प को सामान्य करेगा git worktree add(कमांड जो एक रेपो के लिए कई कार्यशील पेड़ों के साथ काम करने की अनुमति देता है )

रे जांग ( ) द्वारा कम्‍योर एफई 2 ए0एसी (29 मार्च 2016) देखें । हेल्प-बाय: एरिक सनशाइन ( ) , और जूनियो सी हमानो ( )( जूनियो सी हमानो द्वारा विलय - - में 0d8683c , 13 अप्रैल 2016)OneRaynyDay
sunshinecogitster
gitster

git worktreeआदमी पेज अब में शामिल हैं:

--[no-]checkout:

डिफ़ॉल्ट रूप से, addचेक आउट <branch>, हालांकि, --no-checkoutअनुकूलन करने के लिए चेकआउट को दबाने के लिए इस्तेमाल किया जा सकता है, जैसे कि विरल-चेकआउट को कॉन्फ़िगर करना


4

केवल विशिष्ट फ़ोल्डर में चेकआउट करने के लिए कदम:

1) git clone --no-checkout  <project clone url>  
2) cd <project folder>
3) git config core.sparsecheckout true   [You must do this]
4) echo "<path you want to sparce>/*" > .git/info/sparse-checkout
    [You must enter /* at the end of the path such that it will take all contents of that folder]
5) git checkout <branch name> [Ex: master]

FYI करें, पहले (1) चरण में, आपको --no-checkout का उपयोग करने की कोई आवश्यकता नहीं है। बस पूरे रेपो को क्लोन करें और फिर नीचे दिए गए सभी चरणों को 2-5 (ऊपर उल्लिखित) निष्पादित करें, आपको वह आउटपुट मिलेगा जो आप चाहते हैं। मुझे पता है अगर तुम यह नहीं मिला।
SANDEEP MACHIRAJU

4

के आधार पर इस जवाब से apenwarr और इस टिप्पणी से Miral निम्नलिखित समाधान जो मुझे डिस्क स्थान का लगभग 94% बचाया जब क्लोनिंग के साथ आया था मैं linux Git स्थानीय स्तर पर भंडार है, जबकि केवल एक प्रलेखन उपनिर्देशिका चाहने:

$ cd linux
$ du -sh .git .
2.1G    .git
894M    .
$ du -sh 
2.9G    .
$ mkdir ../linux-sparse-test
$ cd ../linux-sparse-test
$ git init
Initialized empty Git repository in /…/linux-sparse-test/.git/
$ git config core.sparseCheckout true
$ git remote add origin ../linux
# Parameter "origin master" saves a tiny bit if there are other branches
$ git fetch --depth=1 origin master
remote: Enumerating objects: 65839, done.
remote: Counting objects: 100% (65839/65839), done.
remote: Compressing objects: 100% (61140/61140), done.
remote: Total 65839 (delta 6202), reused 22590 (delta 3703)
Receiving objects: 100% (65839/65839), 173.09 MiB | 10.05 MiB/s, done.
Resolving deltas: 100% (6202/6202), done.
From ../linux
 * branch              master     -> FETCH_HEAD
 * [new branch]        master     -> origin/master
$ echo "Documentation/hid/*" > .git/info/sparse-checkout
$ git checkout master
Branch 'master' set up to track remote branch 'master' from 'origin'.
Already on 'master'
$ ls -l
total 4
drwxr-xr-x 3 abe abe 4096 May  3 14:12 Documentation/
$  du -sh .git .
181M    .git
100K    .
$  du -sh
182M    .

इसलिए मैं 2.9GB से 182MB तक नीचे उतर गया जो पहले से ही शांत है।

हालाँकि मुझे इसके साथ काम करने के लिए नहीं मिला था git clone --depth 1 --no-checkout --filter=blob:none file:///…/linux linux-sparse-test( तब यहाँ संकेत दिया गया था ) तब लापता फ़ाइलों को हटा दिया गया था। तो अगर किसी को भी जानता है के बराबर git clone --filter=blob:noneके लिए git fetch, हम शायद कुछ और मेगाबाइट बचा सकता है। (मैन पेज को पढ़ना git-rev-listभी संकेत देता है कि कुछ ऐसा है --filter=sparse:path=…, लेकिन मुझे वह काम नहीं मिला।

(सभी ने डेबियन बस्टर से 2.20.1 git के साथ प्रयास किया।)


1
दिलचस्प प्रतिक्रिया। Upvoted। मैं --filter=sparse:path=…या तो नहीं जानता ।
वॉनसी

3

मैं git के लिए नया हूं लेकिन ऐसा लगता है कि अगर मैं प्रत्येक निर्देशिका के लिए git चेकआउट करता हूं तो यह काम करता है। इसके अलावा, स्पार्स-चेकआउट फ़ाइल को प्रत्येक निर्देशिका के बाद एक अनुगामी स्लेश की आवश्यकता है जैसा कि संकेत दिया गया है। कोई और अनुभव कृपया पुष्टि करें कि यह काम करेगा।

दिलचस्प बात यह है कि अगर आप किसी निर्देशिका को विरल-चेकआउट फ़ाइल में नहीं चेक करते हैं तो इससे कोई फर्क नहीं पड़ता है। वे git स्थिति में दिखाई नहीं देते हैं और पढ़े-गए पेड़ -m -u HEAD के कारण इसे हटाया नहीं जाता है। git रीसेट --hard के कारण निर्देशिका को हटाया नहीं जा सकता है। किसी को भी इस बात पर टिप्पणी करने का अधिक अनुभवी अनुभव है कि कौन सी निर्देशिकाओं के बारे में सोचता है जो बाहर की जाँच की जाती हैं लेकिन जो विरल चेकआउट फ़ाइल में नहीं हैं?


0

मेरे मामले में, मैं Podsप्रोजेक्ट को क्लोन करते समय फ़ोल्डर को छोड़ना चाहता हूं । मैंने नीचे की तरह कदम से कदम रखा और यह मेरे लिए काम करता है। आशा करता हूँ की ये काम करेगा।

mkdir my_folder
cd my_folder
git init
git remote add origin -f <URL>
git config core.sparseCheckout true 
echo '!Pods/*\n/*' > .git/info/sparse-checkout
git pull origin master

मेमो, यदि आप अधिक फ़ोल्डरों को छोड़ना चाहते हैं, तो बस स्पार्स-चेकआउट फ़ाइल में अधिक लाइन जोड़ें।

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