गिट के साथ विशिष्ट निर्देशिका कैसे खींचें


193

मेरे पास git के साथ एक परियोजना है, और मैं सिर्फ एक विशिष्ट निर्देशिका को क्लोन या खींचना चाहता हूं, जैसे myproject / javascript ठीक वैसे ही जैसे तोड़फोड़ करता है।
कुछ बदलाव करें, कमिट करें और फिर से पीछे धकेलें।
यह संभव है?


3
विरल चेकआउट आपको दिलचस्पी ले सकता है (भले ही आपको अभी भी सब कुछ लाने की ज़रूरत है): देखें stackoverflow.com/questions/2416815/…
VonC

जवाबों:


205
  1. अपने रेपो कॉपी के शीर्ष पर सीडी
  2. git fetch
  3. git checkout HEAD path/to/your/dir/or/file

    • जहाँ " path/..." (3) रेपो रूट के ठीक नीचे निर्देशिका में शुरू होता है जिसमें आपका " .../file" है

    • ध्यान दें कि "HEAD" के बजाय, एक विशिष्ट कमिट के हैश कोड का उपयोग किया जा सकता है, और फिर आपको उस कमिटमेंट के लिए संशोधन (फ़ाइल) या संशोधन (dir) मिलेगा।


1
बस एहसास हुआ कि मैंने सवाल गलत समझा। इसके बजाय मेरा उत्तर यह बताता है कि किसी एकल फ़ाइल को कैसे चेक किया जाए, जिसे फिर संशोधित और प्रतिबद्ध किया जा सकता है।
०१

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

21
यह अभी भी पूरे रेपो हो जाता है। 2GB आकार की एक परियोजना के लिए, यह ज्यादा समय नहीं बचाता है
Pithikos

5
उन लोगों के लिए जो इन टिप्पणियों को पढ़ते हैं और यह नहीं जानते कि यह कैसे इस सवाल का जवाब नहीं देता है, यह समाधान आपको केवल एक फ़ोल्डर की एक प्रति देता है, लेकिन यह एक काम करने वाली प्रतिलिपि नहीं है, जिसका अर्थ है कि आप संशोधित नहीं कर सकते हैं और फिर से कर सकते हैं। -commit। जैसा कि @ मॉर्गन ने कहा, यह प्रश्न के शीर्षक को संबोधित करता है (आप केवल एक डीआईआर खींच सकते हैं), लेकिन सवाल के शरीर का जवाब नहीं देता ("कुछ बदलाव करें, प्रतिबद्ध करें और फिर से वापस धक्का दें")।
एमएसबी

@StanHolodnak --की आवश्यकता नहीं है। यह बिट्स को एक पथ के रूप में व्याख्या करने के लिए मजबूर करता है। तो, हाँ, अगर आपके पास उस नाम के साथ एक फ़ाइल है --helpजिसे आप चेकआउट करना चाहते हैं, तो इन हाइफ़न के साथ प्रीफ़िक्स करना आवश्यक होगा:git checkout HEAD -- --help
टिम विज़ी

105

खाली निर्देशिका में:

git init
git remote add [REMOTE_NAME] [GIT_URL]
git fetch REMOTE_NAME
git checkout REMOTE_NAME/BRANCH -- path/to/directory

यह काम करता है अगर आप केवल स्थानीय फ़ाइल को बदलने के लिए किसी फ़ाइल के दूरस्थ संस्करण का उपयोग करना चाहते हैं, तो मुझे लगता है
जॉन

यह फ़ोल्डर को भी खींचता है, फ़ोल्डर को कैसे नहीं लोड करना है, लेकिन केवल फ़ोल्डर के अंदर की चीजें?
अल कसिह

इसके लिए fetchया checkoutकमांड की कोई आवश्यकता नहीं है , हम remote addपूरी मास्टर शाखा को प्राप्त करने के लिए कमांड के बाद बस पुल अनुरोध कर सकते हैं ।
इकरा

2
जैसा कि पिथकोस स्वीकार किए गए उत्तर में बताते हैं, यह उत्तर भी आपके स्थानीय मशीन को WHOLE रिमोट रिपॉजिटरी डाउनलोड करेगा। शिंगारा का जवाब सबसे स्पष्ट है - रेपो के एक हिस्से को दूर से खींचने का कोई तरीका नहीं है। हालांकि, उन लोगों के लिए जो WHOLE भ्रूण की बैंडविड्थ को बुरा नहीं मानते हैं, और स्थानीय कैश के एक हिस्से की एक कार्य प्रतिलिपि बनाने में रुचि रखते हैं, फिर स्वीकृत उत्तर आपको दिखाता है कि कैसे। लेकिन मैं सिर्फ यह स्पष्ट करना चाहता हूं कि रेपो (संपीड़ित प्रारूप में) के पूरे इतिहास को आपकी मशीन पर डाउनलोड किया जाना चाहिए।
गाबे हल्समर

39

बहुत उत्तर की तलाश के बाद, ढूंढना नहीं, छोड़ना, फिर से कोशिश करना और इसी तरह, मैंने आखिरकार एक और सूत्र में इसका हल ढूंढ लिया:

कैसे एक फ़ोल्डर में सभी को खींचने के लिए

कॉपी-पेस्ट करने के लिए क्या है:

git init
git remote add -f origin <url>
git config core.sparsecheckout true
echo <dir1>/ >> .git/info/sparse-checkout
echo <dir2>/ >> .git/info/sparse-checkout
echo <dir3>/ >> .git/info/sparse-checkout
git pull origin master

ओपी चाहता है (केवल एक डीआईआर पर काम) करने के लिए, बस उस एक डीआईआर को जोड़ें .git/info/sparse-checkout ऊपर दिए गए चरणों को करते समय ।

@Cforbish के लिए बहुत-बहुत धन्यवाद!


2
मैं इसे ज्यादातर यहाँ पोस्ट कर रहा हूँ क्योंकि जब भी मैं गूगल करने की कोशिश करता हूँ कि यह कैसे करना है, यह एक शीर्ष परिणाम है, और वह धागा प्रदर्शित होने के करीब भी नहीं है। :( मैं बुरा कॉपी-पेस्ट लग रहा है, लेकिन मुझे लगता है कि यह इतना सर्वोत्तम प्रथाओं है?
MSB

1
यह केवल एक स्वच्छ समाधान है। ऊपर दिए गए जवाबों की कोशिश की। अन्य उत्तरों के साथ मैंने अपनी शाखा की जाँच करने के बाद, मैं खींच नहीं सका, और कई नई फाइलें थीं जिनके लिए प्रतिबद्ध होना आवश्यक था। इस समाधान के साथ सब कुछ सही लगता है। लेकिन ध्यान दें: चाहे जिस शाखा की जाँच की गई हो, वह समझेगी कि आप अंदर हैं master। बस सुनिश्चित करें कि आप git branch --set-upstream-to=origin/<branch>सही ढंग से खींचने के लिए करते हैं
Seebiscuit

12

यह मुमकिन नहीं है। आपको सभी रिपॉजिटरी या कुछ भी नहीं चाहिए।


1
भले ही आपको सब कुछ प्राप्त करने की आवश्यकता है , क्या इस मामले में एक विरल चेकआउट काम करने वाले पेड़ पर एक पुल होगा? देखें stackoverflow.com/questions/2416815/…
VonC

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

12
@OmnipotentEntity Sorry but IMHO it does make sense. The implementation shouldn't limit the use. Git does know what directories are (at least when creating a local working copy) so there's no reason it couldn't perform some similar operation on the server and just send the relevant output. Granted, that's not currently implemented but that's due to a lack of a feature, not a fundamental impossibility. Personally I think it's a pretty important feature but hey, that's one reason I avoid git when possible.
Basic

10

Maybe this command can be helpful :

git archive --remote=MyRemoteGitRepo --format=tar BranchName_or_commit  path/to/your/dir/or/file > files.tar

"Et voilà"


2
यह संग्रह उद्देश्यों के लिए फ़ाइल की एक विशिष्ट निर्देशिका को डाउनलोड करता है, यह एक प्रतिलिपि नहीं खींचता है जिसे आप संशोधित कर सकते हैं और वापस धक्का दे सकते हैं।
leetNightshade

बहुत ही शांत। संभवतः ओपी के समाधान के रूप में स्वीकार्य नहीं है, लेकिन यह वास्तव में मैं क्या था क्योंकि मुझे सिर्फ एक बड़े फ़ोल्डर की सामग्री को और भी बड़े रेपो में खोजने की आवश्यकता है, जो मैं निश्चित रूप से प्राप्त नहीं करना चाहता, और मुझे संशोधित करने की आवश्यकता नहीं है / धक्का दें।
ओलिवर

7

यदि आप किसी निर्देशिका में नवीनतम परिवर्तन प्राप्त करना चाहते हैं, तो आप कर सकते हैं:

$ git -C <Path to directory> pull

4

git clone --filter २.१ ९ से

यह विकल्प वास्तव में सर्वर से अनावश्यक वस्तुओं को लाना छोड़ देगा।

मैंने वर्तमान समर्थन स्थिति की व्याख्या करते हुए एक विस्तृत उत्तर लिखा है: मैं केवल Git रिपॉजिटरी के एक उपनिर्देशिका का क्लोन कैसे बनाऊं?

यह बहुत संभावना है कि git cloneउस क्षेत्र के लिए जो कुछ भी कार्यान्वित किया जाता है उसके git pullअनुरूप भी होंगे ।


1

इस काम की कोशिश की और परीक्षण किया!

mkdir <directory name> ;  //Same directory name as the one you want to pull
cd <directory name>;
git remote add origin <GIT_URL>;
git checkout -b '<branch name>';
git config core.sparsecheckout true;
echo <directory name>/ >> .git/info/sparse-checkout;
git pull origin <pull branch name>

आशा है कि यह मददगार था!


0

कभी-कभी, आप केवल फ़ाइलों की पिछली प्रतियों पर एक नज़र रखना चाहते हैं, जो कि भिन्नताओं से गुजरने की कठोरता के बिना नहीं होती हैं।

ऐसे मामले में, रिपॉजिटरी का क्लोन बनाना आसान है और उस विशिष्ट कमेंट की जांच करें जिसमें आप रुचि रखते हैं और उस क्लोन रिपॉजिटरी में उपनिर्देशिका पर एक नजर है। क्योंकि सब कुछ स्थानीय है आप बस जब आप कर रहे हैं इस क्लोन को हटा सकते हैं।


-1

सैद्धांतिक फ़ाइल पथों और मेरे जैसे उदाहरणों के साथ संघर्ष करने वाले सभी के लिए, यहां एक वास्तविक दुनिया उदाहरण है: Microsoft अपने डॉक्स और उदाहरणों को गिट हब पर प्रस्तुत करता है, दुर्भाग्य से वे इस भंडार में बड़ी मात्रा में विषयों के लिए अपने सभी उदाहरण फ़ाइलों को इकट्ठा करते हैं:

https://github.com/microsoftarchive/msdn-code-gallery-community-s-z

मुझे केवल पथ में Microsoft Dynamics js फ़ाइलों में रुचि थी

msdn-code-gallery-community-s-z/Sdk.Soap.js/

इसलिए मैंने निम्नलिखित कार्य किया

बनाओ

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

डिस्क पर मेरे रिपॉजिटरी फ़ोल्डर में फ़ाइल

git sparse-checkout init

उस निर्देशिका में विंडोज़ पर cmd का उपयोग करते हुए

की फ़ाइल सामग्री

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

है

Sdk.Soap.js/*

finally do a

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