Git Clone: ​​बस फाइलें, कृपया?


141

मैं एक जीआईटी रेपो क्लोन करना चाहता हूं और एक .gitनिर्देशिका के साथ समाप्त नहीं होना चाहिए । दूसरे शब्दों में मैं सिर्फ फाइलें चाहता हूं। क्या इसे करने का कोई तरीका है?

git clone --no-checkoutमैं जो चाहता हूं उसके ठीक विपरीत किया (मुझे सिर्फ .gitनिर्देशिका दी)।

मुझे क्या करना है कि एक के लिए कोशिश कर रहा हूँ दूरस्थ अर्थ यह है रेपो, नहीं एक स्थानीय एक, एक नकली नहीं "का " (जैसे "SVN निर्यात") Git निर्यात कैसे एक करने के लिए " " (भले ही समाधान किया जा रहा है खत्म हो सकता है वही)।



@Gre Hewgill मैं एक दूरस्थ रेपो से ऐसा करने की कोशिश कर रहा हूं। यकीन नहीं है कि अगर यह सवाल अद्वितीय बनाता है, हालांकि।
डैन रोसेनस्टार्क

1
हालांकि यह एक नया सवाल है, लेकिन मुझे लगता है कि यह जांचने लायक है: stackoverflow.com/questions/11497457/…
eonil 25'15

1
मेरा अपडेट उत्तर देखें : git archiveअब (Q4 2017) अधिक सटीक है और इसमें खाली फ़ोल्डर शामिल नहीं होंगे।
वॉन

1
आपका स्वागत है। जाहिरा तौर पर, आपकी टिप्पणी को ध्वजांकित किया गया और हटा दिया गया ... chat.stackoverflow.com/transcript/134259?m=39402889#39402889
VonC

जवाबों:


75

Git कमांड जो आपके द्वारा खोजा जा रहा है, उससे सबसे निकटतम होगा git archiveबैक अप प्रोजेक्ट
देखें जो git का उपयोग करता है : इसमें एक संग्रह सभी फाइलें (सबमॉड्यूल सहित) यदि आप उपयोग कर रहे हैं शामिल होंगेgit-archive-all स्क्रिप्ट )

आप उस संग्रह को कहीं भी उपयोग कर सकते हैं, आपको केवल फाइलें वापस दे सकते हैं, कोई .gitनिर्देशिका नहीं ।

git archive --remote=<repository URL> | tar -t

यदि आपको पहले स्तर से ही फ़ोल्डर्स और फ़ाइलों की आवश्यकता है:

git archive --remote=<repository URL> | tar -t --exclude="*/*"

दूरस्थ रेपो के केवल प्रथम-स्तरीय फ़ोल्डरों को सूचीबद्ध करने के लिए:

git archive --remote=<repository URL> | tar -t --exclude="*/*" | grep "/"

नोट: जो GitHub के लिए काम नहीं करता (समर्थित नहीं)

इसलिए आपको क्लोन (क्लोन कदम को तेज करने के लिए) की आवश्यकता होगी, और फिर स्थानीय स्तर पर संग्रहित करना होगा :

git clone --depth=1 git@github.com:xxx/yyy.git
cd yyy
git archive --format=tar aTag -o aTag.tar

एक अन्य विकल्प उथला क्लोन करना होगा (जैसा कि नीचे उल्लेख किया गया है), लेकिन .it फ़ोल्डर को कहीं और लगाना।

git --git-dir=/path/to/another/folder.git clone --depth=1 /url/to/repo

रेपो फ़ोल्डर में केवल फ़ाइल शामिल होगी, बिना .git

नोट: कमांडgit --git-dir का एक विकल्प है , नहीं ।gitgit clone


2.14.X / 2.15 (Q4 2017) के साथ अपडेट करें: यह खाली फ़ोल्डरों को जोड़ने से बचने के लिए सुनिश्चित करेगा ।

" git archive", विशेषकर जब पैथस्पेक के साथ उपयोग किया जाता है, तो अपने आउटपुट में एक खाली निर्देशिका संग्रहीत करता है, भले ही गिट खुद कभी ऐसा नहीं करता है।
यह तय कर दिया गया है।

René Scharfe (``) द्वारा प्रतिबद्ध 4318094 (12 सितंबर 2017) देखें । सुझाव-द्वारा: जेफ किंग ( )( जूनियो सी हमानो द्वारा विलय - - ६२ बीसीबी 25, २५ सितंबर २०१io में )
peff
gitster

archive: अभिलेखागार में खाली निर्देशिका न जोड़ें

जबकि गिट खाली निर्देशिकाओं को ट्रैक नहीं करता है, git archiveकुछ को अभिलेखागार में डालने के लिए छला जा सकता है।
जबकि वह ऑब्जेक्ट डेटाबेस द्वारा समर्थित है, इसे इंडेक्स में दर्शाया नहीं जा सकता है और इस प्रकार यह जंगली में होने की संभावना नहीं है।

चूंकि खाली निर्देशिका गिट द्वारा समर्थित नहीं हैं, इसलिए उन्हें अभिलेखागार में भी नहीं लिखा जाना चाहिए।
यदि एक खाली निर्देशिका की वास्तव में आवश्यकता है, तो इसमें एक खाली .gitignoreफ़ाइल रखकर इसे ट्रैक और संग्रहीत किया जा सकता है।


4
इसने मेरे लिए काम किया। मैं एक बात और जोड़ूंगा। यदि आप .it फ़ोल्डर की बिल्कुल भी परवाह नहीं करते हैं, तो मैं इस कमांड का उपयोग git --git-dir=/dev/null clone --depth=1 /url/to/repo
करूंगा

यह
.git

@VonC मैंने कोशिश की: git --git-dir = / dev / null clone --depth = 1 / url / to / repo
aliasav

1
दौड़कर git archive --remote=https://github.com/pornel/dssim.git @ | tar -tमुझे मिलता है tar: This does not look like a tar archive। यह GitHub के साथ काम नहीं करता है? इसके अलावा, क्या @मतलब है?
एंड्रे वेर्लंग

2
@ AndréWerlang 7 साल बाद ... मुझे भी यकीन नहीं है @: मैंने इसे हटा दिया है। इसके अलावा GitHub एक रिमोट का समर्थन नहीं करता है git archive: मैंने एक विकल्प का प्रस्ताव करने के लिए उत्तर को संपादित किया है।
वॉनसी

59
git archive --format=tar --remote=<repository URL> HEAD | tar xf -

यहां से ले जाया गया


2
--format=tarअनावश्यक है। "टार" डिफ़ॉल्ट आउटपुट है, जिसे निर्दिष्ट करने की आवश्यकता नहीं है।
VasiliNovikov

1
पाइपिंग tar xपर्याप्त है
जेन्स बैनमैन

42

आप केवल अंतिम कुछ संशोधन प्राप्त करने के लिए एक उथले क्लोन बना सकते हैं:

 git clone --depth 1 git://url

फिर या तो .it निर्देशिका को हटा दें या git archiveअपने पेड़ को निर्यात करने के लिए उपयोग करें।


जब मैं क्लोन को दोहराकर इसे अपडेट करता हूं, तो हॉव ओ इस त्रुटि को रोकते हैं: "घातक: गंतव्य पथ 'XYZ' पहले से मौजूद है और एक खाली निर्देशिका नहीं है।"
सोहेल सी

1
@SohailSi: या तो एक नए स्थान पर क्लोन करें या पुरानी निर्देशिका को हटा दें। यदि आप अपनी स्थानीय प्रति अपडेट करना चाहते हैं, तो आप शायद नए संशोधनों को लाने से बेहतर हैं।
knittl

3

एक क्लोन क्यों नहीं किया जाता है और फिर .gitनिर्देशिका को हटा दें ताकि आपके पास बस एक नंगे काम की नकल हो?

संपादित करें: या वास्तव में क्लोन का उपयोग क्यों करें? जब आप कहते हैं कि आप एक गिट रेपो चाहते हैं, लेकिन एक .gitनिर्देशिका के बिना यह थोड़ा भ्रमित है । यदि आपका मतलब है कि आप पेड़ के कुछ राज्य की एक प्रति चाहते हैं, तो cp -Rगिट क्लोन के बजाय शेल में क्यों न करें और फिर बाद में हटा दें .git


उसके लिए धन्यवाद। फाइलें गिट रेपो में हैं। मैं मैक उपयोगकर्ताओं को एक पंक्ति में रेपो की एक प्रति प्राप्त करने के लिए निर्देशित करने में सक्षम होने की उम्मीद कर रहा था, इसके बिना जीआईटी रेपो बन गया।
दान रोसेनस्टार्क

यदि आपके पास इसका उपयोग नहीं कर सकते हैं (यानी Git रिपॉजिटरी नहीं है) तो आपको सीधे लोगों को रेपो से कोड प्राप्त नहीं करना चाहिए।
वैकल्पिक

@Amoss एक टारबॉल जारी करना ताकि लोग नवीनतम कोड को लगातार न पकड़ें?
वैकल्पिक

1
@mathepic: और एक टारबॉल जारी करने के लिए आपको रिपॉजिटरी के बाहर एक साफ-सुथरी वर्किंग कॉपी प्राप्त करने का एक तरीका चाहिए - जो वास्तव में एक प्रश्न है।
एंड्रयू

1
नीचे दिए गए उत्तर को पढ़ना और फिर थोड़ा-सा काम करना एक और सवाल का कारण बन गया: stackoverflow.com/questions/160608/… यदि आप git आर्काइव के उपयोग पर एक नज़र डालते हैं - अंतिम रूप से तो यह वही करता है जो आप (और मूल पोस्टर) करते हैं। ) तलाश रहे हैं। संपादित करें: जो कि जॉन ने नीचे जवाब दिया।
एंड्रयू

2

ऐसा लगता है कि आप स्रोत कोड की एक प्रति चाहते हैं। यदि ऐसा है तो क्यों न केवल निर्देशिका को कॉपी करें और कॉपी से .git निर्देशिका को बाहर करें?


5
कि मैं क्या पूछ रहा हूँ: कैसे git के साथ ऐसा करने के लिए ... मैं पहले से ही बता सकता हूँ कि इसका कोई अंतर्निहित तरीका नहीं है, जो मुझे मिल रहे उत्तरों से है। फिर भी धन्यवाद!
दान रोसेनस्टार्क

2

git checkout -f

काम करने वाले पेड़ से रेपो को विभाजित करके ऐसा करने का एक और तरीका है।

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

हम दो फ़ोल्डर बनाएंगे, एक काम करने वाली फ़ाइलों के लिए एक:

mkdir workingfiles
mkdir barerepo.git

एक नंगे गिट रेपो को आरंभीकृत करें:

cd barerepo.git
git --bare init 

फिर एक पोस्ट-प्राप्त हुक बनाएँ:

touch hooks/post-receive
chmod ug+x hooks/post-receive

अपने पसंदीदा संपादक में पोस्ट-पोस्ट संपादित करें:

GIT_WORK_TREE=/path/to/workingfiles git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]

इसे रिमोट के रूप में जोड़ें:

git remote add myserver ssh://user@host:/path/to/barerepo.git

अब हर बार जब आप इस नंगे रेपो को धकेलेंगे तो यह काम करने वाले पेड़ की जाँच करेगा /workingfiles/। लेकिन /workingfiles/खुद संस्करण नियंत्रण में नहीं है; चल रहा हैgit status में /workingfiles/त्रुटि देगा fatal: Not a git repository (or any parent up to mount point /data)। यह सिर्फ सादा फाइलें हैं।

अन्य समाधान rm -r .gitकमांड के विपरीत की आवश्यकता नहीं है, इसलिए यदि /workingfiles/कुछ अन्य git रेपो हैं, तो आपको अन्य रेपो के git फ़ाइलों को हटाने के लिए उपयोग की जाने वाली कमांड के बारे में चिंता करने की आवश्यकता नहीं है।


1
माना। नंगे रेपो पर एक पोस्ट-प्राप्त हुक यहां संभव है। +1
वॉनसी

बहुत सारे काम अगर आप केवल फाइलों को प्राप्त करने की कोशिश कर रहे हैं
रेनब

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