एक "गिट निर्यात" ("svn निर्यात" की तरह) करें?


2356

मैं सोच रहा था कि क्या एक अच्छा "गिट एक्सपोर्ट" समाधान है जो .gitरिपॉजिटरी डायरेक्टरी के बिना पेड़ की एक प्रति बनाता है । कम से कम तीन तरीके मुझे पता हैं:

  1. git clone.gitरिपॉजिटरी डायरेक्टरी को हटाकर ।
  2. git checkout-index इस कार्यक्षमता के लिए दृष्टिकोण लेकिन "इंडेक्स में वांछित पेड़ को पढ़ें ..." से शुरू होता है, जो मुझे पूरी तरह से यकीन नहीं है कि कैसे करना है।
  3. git-exportएक तीसरी पार्टी स्क्रिप्ट है जो अनिवार्य git cloneरूप rsync --exclude='.git'से अंतिम गंतव्य में पीछा एक अस्थायी स्थान में करता है।

इन समाधानों में से कोई भी वास्तव में संतोषजनक होने के कारण मुझे हड़ताल नहीं करता है। निकटतम एक svn exportविकल्प 1 हो सकता है, क्योंकि उन दोनों को पहले लक्ष्य निर्देशिका को खाली करने की आवश्यकता होती है। लेकिन विकल्प 2 और भी बेहतर लगता है, यह मानते हुए कि मैं यह समझ सकता हूं कि सूचकांक में एक पेड़ को पढ़ने का क्या मतलब है।


1
@rnrTom: सोमोव का जवाब देखें। (एक टार संग्रह में "संपीड़ित" कुछ भी नहीं है)।
इटारियन

23
@ mrTom git archive --format zip --output "output.zip" master -0आपको एक असम्बद्ध संग्रह देगा (-0 असम्पीडित के लिए ध्वज है)। git-scm.com/docs/git-archive

7
मैं @ mrTom के साथ सहमत हूं, और मुझे नहीं लगता कि संग्रह संकुचित है या असम्पीडित मुख्य मुद्दा है। SVN के साथ, मैं exportदूरस्थ रिपॉजिटरी से सीधे 250 kB उपनिर्देशिका कर सकता हूं (जो कि संशोधन को छोड़कर 200 एमबी आकार में हो सकता है) - और मैं केवल 250 kB (या तो) डाउनलोड हस्तांतरण के लिए नेटवर्क को हिट करूंगा। के साथ git, archiveसर्वर पर सक्षम होना चाहिए (इसलिए मैं इसे आज़मा नहीं सकता) - clone --depth 1सर्वर से अभी भी 25 एमबी का रेपो प्राप्त कर सकता है, जहां .gitसबफ़ोल्डर अकेले 15 एमबी लेता है। इसलिए, मैं अभी भी कहूंगा कि उत्तर "नहीं" है।
सादाऊ

@mrTom जवाब वास्तव में है हाँ हाँ ओपी का जवाब देखें - कमांड हैgit checkout-index
nocache

यहाँ एक अच्छा और सरल तरीका है:git archive -o latest.zip HEAD
इवगेरी सर्गेव

जवाबों:


2396

संभवतः इसे प्राप्त करने का सबसे सरल तरीका है git archive। यदि आपको वास्तव में सिर्फ विस्तारित पेड़ की आवश्यकता है तो आप ऐसा कुछ कर सकते हैं।

git archive master | tar -x -C /somewhere/else

अधिकांश समय जिसे मुझे git से कुछ 'निर्यात' करने की आवश्यकता होती है, मैं किसी भी मामले में एक संपीड़ित संग्रह चाहता हूं इसलिए मैं ऐसा कुछ करता हूं।

git archive master | bzip2 >source-tree.tar.bz2

ज़िप संग्रह:

git archive --format zip --output /full/path/to/zipfile.zip master 

git help archive अधिक जानकारी के लिए, यह काफी लचीला है।


ध्यान रखें कि भले ही आर्काइव में .it डायरेक्टरी नहीं होगी, फिर भी, इसमें अन्य छिपी हुई गिट-विशिष्ट फाइलें जैसे कि .ignignore, .gitattributes, आदि शामिल होंगी। अगर आप उन्हें आर्काइव में नहीं चाहते हैं, तो सुनिश्चित करें कि आप निर्यात-इग्नोरिटी विशेषता का उपयोग करें। initattributes फ़ाइल में करें और अपने संग्रह को करने से पहले यह प्रतिबद्ध करें। अधिक पढ़ें...


नोट: यदि आप सूचकांक के निर्यात में रुचि रखते हैं, तो कमांड है

git checkout-index -a -f --prefix=/destination/path/

( अधिक जानकारी के लिए ग्रेग का जवाब देखें)


198
ज़िप संग्रह:git archive --format zip --output /full/path master
वादिम

221
ध्यान रखें कि आर्काइव में .IT निर्देशिका नहीं होगी, लेकिन इसमें अन्य छिपी हुई विशिष्ट-विशिष्ट फाइलें जैसे।। a .gitattributes फ़ाइल और अपने संग्रह करने से पहले यह प्रतिबद्ध है। फीडिंग
2010/

54
धाराओं के नोट पर अनुवर्ती कार्रवाई करने के लिए: आप जिप के अंदर पैक की जाने वाली निर्देशिका नाम को नियंत्रित करने के लिए कमांड में एक '--prefix = कुछ /' स्ट्रिंग जोड़ सकते हैं। उदाहरण के लिए, यदि आप git archive --format zip --output /path/to/file.zip --prefix=newdir/ masterआउटपुट का उपयोग करते हैं तो इसे 'file.zip' कहा जाएगा, लेकिन जब आप इसे अनपैक करते हैं, तो शीर्ष स्तर की निर्देशिका 'newdir' होगी। (यदि आप - उपसर्ग विशेषता को छोड़ देते हैं, तो शीर्ष स्तर की डायर 'फ़ाइल' होगी।)
एलन डब्ल्यू। स्मिथ

89
सबसे आसान तरीका: git archive -o latest.zip HEADयह एक ज़िप संग्रह बनाता है जिसमें वर्तमान शाखा पर नवीनतम प्रतिबद्ध की सामग्री शामिल है। ध्यान दें कि आउटपुट स्वरूप आउटपुट फ़ाइल के विस्तार से अनुमानित है।
nacho4d


320

मुझे पता चला कि विकल्प 2 का क्या मतलब है। एक भंडार से, आप कर सकते हैं:

git checkout-index -a -f --prefix=/destination/path/

पथ के अंत में स्लेश महत्वपूर्ण है, अन्यथा यह फाइलों में 'पथ' के उपसर्ग के साथ / गंतव्य में होगा।

चूंकि एक सामान्य स्थिति में सूचकांक में रिपॉजिटरी की सामग्री होती है, इसलिए "वांछित पेड़ को इंडेक्स में पढ़ना" करने के लिए कुछ विशेष नहीं है। यह पहले से ही है।

-aझंडा सूचकांक में सभी फाइलों की जांच के लिए आवश्यक है (मुझे यकीन है कि क्या यह इस स्थिति में इस ध्वज को छोड़ देना है, क्योंकि यह जो मैं चाहता भी नहीं करता है इसका मतलब है नहीं कर रहा हूँ)। -fझंडा बलों उत्पादन है, जो इस आदेश को सामान्य रूप से काम नहीं करता किसी भी मौजूदा फ़ाइलों को अधिलेखित।

यह "गिट एक्सपोर्ट" की तरह प्रतीत होता है जिसकी मुझे तलाश थी।


73
... और अंत में SLASH याद रखें, या आप वांछित असर नहीं होगा;)
conny

1
git addआदेश सूचकांक, इसलिए जो कुछ भी सामग्री को बदल git statusशो के रूप में "के लिए प्रतिबद्ध होना करने के लिए" है मतभेद सिर और सूचकांक की सामग्री के बीच।
ग्रेग हेविगिल

7
@conny: आपकी टिप्पणी पढ़ी, इसके बारे में भूल गए और बिना किसी स्लेश के कमांड को चलाया। टिप:
शंकु

35
+1 सलाह की सलाह देने के लिए। इसके अलावा, '~ / डेस्ट /' बनाने की कोशिश न करें, क्योंकि यह आपकी वर्किंग डायरेक्टरी में '~' नामक एक निर्देशिका बनाता है, बजाय इसके कि आप वास्तव में क्या चाहते हैं। लगता है कि क्या होता है जब आप नासमझ टाइप करते हैं rm -rf ~
काइल हिरोनिमस

5
@ केलीहेइरोनिमस - '~ / dest / `का उपयोग करने के बारे में आपकी चेतावनी सही है यदि आप अपने उपसर्ग पथ के चारों ओर उद्धरण का उपयोग करते हैं जो शेल को टिल्ड विस्तार नहीं करने के लिए कहता है। आपके वर्किंग डायर में एक डायर को बुलाया जाएगा ~(नहीं '~'!)। git checkout-indexइस संबंध में कुछ खास नहीं है : यह सच है mkdir '~/dest'( ऐसा मत करो! )। फ़ाइल नाम से बचने के लिए अभी तक एक और अच्छा कारण है कि उद्धृत करने की आवश्यकता है (जैसे कि उनमें एक स्थान है) :-)
मैट वालिस

254

git archive रिमोट रिपॉजिटरी के साथ भी काम करता है।

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

रेपो के अंदर विशेष पथ को निर्यात करने के लिए जितने रास्ते आप चाहें, उतने अंतिम तर्क के रूप में जोड़ सकते हैं:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv

6
यह एक ऐसा विकल्प है जो मुझे सबसे अच्छा लगता है। इसका अतिरिक्त लाभ यह है कि यह नंगे भंडार पर भी काम करता है।
इन्नामे

5
बेहतर संस्करण है: git archive --format=tar --prefix=PROJECT_NAME/ --remote=USER@SERVER:PROJECT_NAME.git master | tar -xf - (यह सुनिश्चित करता है कि आपका संग्रह एक फ़ोल्डर में है)
निक

7
नोट : सर्वर को इस सुविधा को सक्षम करना होगा।
जैकब नारबस्की

12
मैंने कोशिश की: git archive --format=zip --output foo.zip --remote=https://github.com/xxx.git masterऔर घातक हो गया: ऑपरेशन प्रोटोकॉल द्वारा समर्थित नहीं है। कमांड स्ट्रीम का अप्रत्याशित अंत।
एंडी

7
@andyf GitHub का अपना तरीका है: curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -प्रति डॉक्स
बिशप

62

यहां छवि विवरण दर्ज करें

एक विशेष मामले का जवाब अगर रिपॉजिटरी GitHub पर होस्ट किया गया है।

बस उपयोग करें svn export

जहां तक ​​मुझे पता है कि गितुब अनुमति नहीं देता है archive --remote। यद्यपि GitHub svn संगत है और उनके पास सभी git repos svnसुलभ हैं, इसलिए आप svn exportअपने GitHub url में कुछ समायोजन के साथ सामान्य रूप से उपयोग कर सकते हैं ।

उदाहरण के लिए, संपूर्ण रिपॉजिटरी निर्यात करने के लिए, ध्यान दें कि trunkURL कैसे बदलता है master(या परियोजना की HEAD शाखा जो भी सेट हो ):

svn export https://github.com/username/repo-name/trunk/

और आप किसी एकल फ़ाइल या एक निश्चित पथ या फ़ोल्डर को भी निर्यात कर सकते हैं:

svn export https://github.com/username/repo-name/trunk/src/lib/folder

JQuery जावास्क्रिप्ट पुस्तकालय के साथ उदाहरण

HEADशाखा या मास्टर शाखा उपलब्ध का उपयोग करेंगे trunk:

svn ls https://github.com/jquery/jquery/trunk

गैर HEAD शाखाओं के तहत सुलभ हो जाएगा /branches/:

svn ls https://github.com/jquery/jquery/branches/2.1-stable

सभी टैग के तहत /tags/एक ही फैशन में:

svn ls https://github.com/jquery/jquery/tags/2.1.3

1
git archiveGitHub के साथ ठीक काम करता है, जब तक आप Git प्रोटोकॉल का उपयोग, बस की जगह https://के साथ git://URL में। मुझे नहीं पता कि GitHub इस छिपी हुई सुविधा का विज्ञापन क्यों नहीं करता है।
नील मैय्यू

1
@NeilMayhew यह मेरे लिए काम नहीं करता है, मुझे मिलता है fatal: The remote end hung up unexpectedly। JQuery के github रेपो के साथ दो अलग-अलग सर्वरों पर कोशिश की।
एंथोनी हट्ज़ोपुलोस

आप सही हे। मैं भूल गया था कि मैं git config url.<base>.insteadOfदूरस्थ रिपॉजिटरी को कैश करने के लिए उपयोग कर रहा था । इसलिए मैं file://वास्तविकता में एक URL का उपयोग कर रहा था । मुझे संदेह है कि git archiveकभी भी git://URL के साथ काम कर सकते हैं क्योंकि इसे git-upload-archiveदूरस्थ छोर पर चलाने में सक्षम होना चाहिए । sshप्रोटोकॉल का उपयोग करना संभव होना चाहिए , सिवाय इसके कि जीथब इसे अनुमति नहीं देता ( Invalid command: 'git-upload-archive')।
नील मैय्यू

अगर मैं आंतरिक रूप से होस्ट किए गए git रिपॉजिटरी पर इसे करना चाहता हूं, तो github की तरह व्यवहार करने वाले किसी स्थानीय सर्वर टूल का उपयोग करने का कोई तरीका है?
kriss

1
अपवित्र - यह पूरी तरह से विचित्र है कि Git में यह सुविधा नहीं है और हमें svn का सहारा लेना होगा
जेसन S

40

से Git मैनुअल :

"संपूर्ण पेड़ निर्यात करें" के लिए git-checkout-index का उपयोग करना

उपसर्ग की क्षमता मूल रूप से "ट्री के रूप में निर्यात" फ़ंक्शन के रूप में गिट-चेकआउट-इंडेक्स का उपयोग करने के लिए इसे तुच्छ बनाती है। बस वांछित पेड़ को सूचकांक में पढ़ें, और करें:

$ git checkout-index --prefix=git-export-dir/ -a


19
मुझे लगता है कि भ्रम "सूचकांक में वांछित पेड़ पढ़ें" वाक्यांश है।
davetron5000

4
यदि आप शाखा बार में डायरेक्टरी फू निर्यात करना चाहते हैं, तो यह होगा git read-tree bar:fooऔर उसके git checkout-index --prefix=export_dir/ -aबाद शायद आपको करना चाहिएgit update-index master
पास्कल रोज़िन

1
@ जॉनोल्डन क्या आपको पहले रेपो क्लोन करने की आवश्यकता है? यदि ऐसा है, तो मैं इसे स्वीकार नहीं करूंगा, क्योंकि एक उपनिर्देशिका के "svn निर्यात" का पूरा बिंदु सीधे उस उपनिर्देशिका की एक प्रति प्राप्त करना है; अगर किसी के पास 1GB Git का रेपो है और मैं चाहता हूं कि वह 10kB सबडायरेक्ट हो, तो मुझे पूरी चीज क्लोन करने की आवश्यकता है।
जेसन एस

3
इसके अलावा, मैं "davetron5000 टिप्पणी" वांछित पेड़ को इंडेक्स में पढ़ता हूं "के साथ प्रतिध्वनित करता हूं" जिसका मुझे कोई मतलब नहीं है कि इसका क्या मतलब है।
जेसन एस

38

मैंने एक सरल आवरण लिखा है जिसके चारों ओर git-checkout-indexआप इस तरह का उपयोग कर सकते हैं:

git export ~/the/destination/dir

यदि गंतव्य निर्देशिका पहले से मौजूद है, तो आपको जोड़ना होगा -fया --force

स्थापना सरल है; बस स्क्रिप्ट को अपने में कहीं छोड़ दें PATH, और सुनिश्चित करें कि यह निष्पादन योग्य है।

के लिए github भंडार git-export


15
यह आवरण प्लेटफ़ॉर्म-अज्ञेयवादी नहीं है; यह / बिन / श पर निर्भर करता है। तो अगर आप विंडोज पर हैं, इस समाधान शायद आप के लिए काम नहीं करेगा।
शोव्वनिक

18
उह, यह स्क्रिप्ट 57 पंक्तियों की डॉक्यूमेंटेशन, व्हॉट्सएप, सेटअप, तर्क पार्सिंग, और केवल एक लाइन है जो वास्तव में कुछ करती है ...
व्लादिमीर पैंटेलेव

36

ऐसा प्रतीत होता है कि यह एसवीएन की तुलना में गिट के साथ एक समस्या से कम है। Git केवल रिपोजिटरी रूट में .git फ़ोल्डर डालता है, जबकि SVN प्रत्येक उपनिर्देशिका में एक .svn फ़ोल्डर डालता है। तो "svn निर्यात" पुनरावर्ती कमांड-लाइन जादू से बचा जाता है, जबकि गिट पुनरावृत्ति के साथ आवश्यक नहीं है।


26
SVN 1.7 के रूप में, केवल एक .svn फ़ोल्डर है: subversion.apache.org/docs/release-notes/1.7.html#single-db
kostmo

यह किसी भी अतिरिक्त बिल्ड फ़ाइलों से छुटकारा नहीं देगा जो svn निर्यात को हटाता है। तो यह निश्चित रूप से जवाब नहीं है।
येगो

28

के बराबर

svn export . otherpath

मौजूदा रेपो के अंदर है

git archive branchname | (cd otherpath; tar x)

के बराबर

svn export url otherpath

है

git archive --remote=url branchname | (cd otherpath; tar x)

1
धन्यवाद, यह वही था जो मुझे याद आ रहा था ... निर्यात के टाइमस्टैम्प्स की जांच करने के लिए (वे फाइलों पर भी संरक्षित नहीं होंगे), उपयोग करें git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)... हालांकि, टाइमस्टैम्प के साथ संग्रह करना बिल्कुल तुच्छ नहीं है, इसलिए मैंने पोस्ट किया नीचे उदाहरण है
सदाऊ १५'१४

1
आप सब्सक्रिप्शन के बजाय टार के लिए C विकल्प का उपयोग कर सकते हैं, जैसे: git archive branchname | tar xC otherpath
जेम्स मूर

प्रमुख यह है कि Cटार का विकल्प केवल GNU Tar है।
aredridel

22

यदि आप फ़ाइलों को बाहर नहीं कर रहे हैं .gitattributes export-ignoreतो प्रयास करेंgit checkout

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q

-यदि
सूचकांक से रास्तों की जाँच करते समय, अनमैरिड प्रविष्टियों पर असफल न हों; इसके बजाय, अनमैरिड एंट्रीज़ को अनदेखा किया जाता है।

तथा

-q
वर्बोज़ से बचें

इसके अतिरिक्त आप एसवीएन में किसी भी शाखा या टैग से या किसी विशिष्ट प्रतिबद्ध संशोधन से प्राप्त कर सकते हैं जैसे एसएचए 1 (एसएचए 1 इन गिट में जोड़ना एसवीएन में संशोधन संख्या के बराबर है)

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout 2ef2e1f2de5f3d4f5e87df7d8 -f -q -- ./

/path/to/checkout/रिक्त होना ही चाहिए, Git किसी भी फ़ाइल को नष्ट नहीं होगा, लेकिन बिना किसी चेतावनी के ही नाम के साथ फ़ाइलों के ऊपर लिख देगा

अद्यतन: टैग की गई, शाखाओं या SHA1 के साथ निर्यात के लिए चेकआउट का उपयोग करते समय, काम की समस्या से बचने के लिए या कार्यशील भंडार को बरकरार रखने के लिए, आपको -- ./अंत में जोड़ना होगा

डबल डैश --बताता है कि डैश के बाद सब कुछ पथ या फ़ाइलें हैं, और इस मामले में भी git checkoutनहीं बदलने के लिए कहता हैHEAD

उदाहरण:

इस कमांड को सिर्फ लिबास डायरेक्टरी मिलेगी और readme.txtउसी कमिट से फाइल भी

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt

यह my_file_2_behind_HEAD.txtसिर के पीछे दो कमिट (ओवरराइट) बनाएगाHEAD^2

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout HEAD^2 -f -q -- ./my_file_2_behind_HEAD.txt

दूसरी शाखा का निर्यात प्राप्त करने के लिए

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout myotherbranch -f -q -- ./

नोटिस जो कि ./भंडार के मूल के सापेक्ष है


वास्तव में, कई अन्य लोगों और अपवित्रों के बीच, इसने मेरे लिए सबसे अच्छा काम किया, बिना किसी कंप्रेशन के, नंगे रिपॉजिटरी (गिटोलिट) के साथ ठीक काम किया।
ताकेशिन

1
ध्यान दें कि SHA1 चेकआउट रिपॉजिटरी में "behead" समस्या पैदा करेगा
user5286776117878

वास्तविक @ITGabs, यह ".गित" फ़ोल्डर को डाउनलोड नहीं करता है। इसलिए डाउनलोड किया गया फ़ोल्डर एक git रिपॉजिटरी नहीं है, इसलिए यह तकनीकी रूप से "
beheaded

@FabioMarreco बीहड़ समस्या निर्यात / डाउनलोड की गई फ़ाइलों में नहीं रिपॉजिटरी पर है, मैं अधिक विवरण के लिए उत्तर अपडेट कर रहा हूं
user5286776117878

3
यह मेरे लिए बहुत अच्छा काम किया। लेकिन सबसे पहले मुझे "Not a git repository" त्रुटि संदेश मिला। तब मैंने पाया कि "/ path / to / repo /" को .git फ़ोल्डर को इंगित करना था। तो इसने काम किया: --जित-दिर = / पथ / से / रेपो /
.गित

21

मैं बड़े पैमाने पर गिट-सबमॉडल्स का उपयोग करता हूं। यह एक मेरे लिए काम करता है:

rsync -a ./FROM/ ./TO --exclude='.*'

1
क्या वह फाइलें मिस नहीं होंगी जिनके नाम डॉट से शुरू होते हैं, जैसे कि .htaccess?
ग्रेग हेवगिल

8
एक अच्छा समाधान, मैं बदलूंगा --exclude = '। *' to --exclude = '। git *'
schmunk

18
--exclude-VCS आप इस चातुर्य लेने के लिए जा रहे थे, तो
धीरे-धीरे काम करना

क्या ./FROM/ रिमोट रेपो हो सकता है?
प्रतिरोध डिजाइन

2
FYI के रूप में, मेरी प्रति rsyncइस तर्क को सूचीबद्ध करती है --cvs-exclude। इसके अतिरिक्त, यह अभी भी कॉपी करता है .gitattributesऔर.gitignore
रयान रैंफोर्ड

19

मैंने इस पृष्ठ को अक्सर हिट किया है जब एक गिट रिपॉजिटरी को निर्यात करने का तरीका खोज रहा है। इस सवाल का मेरा जवाब तीन गुणों पर विचार करता है, जो कि svn निर्यात में डिजाइन की तुलना में git की तुलना में है, क्योंकि svn एक केंद्रीकृत भंडार का अनुसरण करता है:

  • यह सभी संशोधनों को निर्यात न करके दूरस्थ रिपॉजिटरी स्थान पर यातायात को कम करता है
  • इसमें निर्यात निर्देशिका में मेटा जानकारी शामिल नहीं है
  • Svn का उपयोग करके एक निश्चित शाखा का निर्यात करना उपयुक्त पथ निर्दिष्ट करके पूरा किया जाता है

    git clone --depth 1 --branch master git://git.somewhere destination_path
    rm -rf destination_path/.git
    

एक निश्चित रिलीज का निर्माण करते समय एक स्थिर शाखा को क्लोन करना उपयोगी होता है जैसे कि --branch stableया --branch release/0.9


यदि गंतव्य मौजूद है और गैर-रिक्त है, तो यह काम नहीं करता है।
शाम

2
एक सच्चा उत्तर: यह गहराई से उत्पन्न होता है। git archive | tarदृष्टिकोण POSIX असंगत खोल वातावरण (जैसे, AppVeyor के CMD- या PowerShell आधारित सीआई), जो गैर आदर्श है लागू नहीं है। git checkoutदृष्टिकोण मुख्य कार्यकारी पेड़ है, जो भयानक है के सूचकांक संशोधित करता है। git checkout-indexदृष्टिकोण मुख्य कार्यकारी पेड़ पहले से संशोधित करने की है, जो भी भयंकर-एर है के सूचकांक की आवश्यकता है। पारंपरिक git cloneदृष्टिकोण उस इतिहास को हटाने से पहले रिपॉजिटरी के इतिहास की संपूर्णता को क्लोन करता है, जो कि बेकार है। यह एकमात्र एकमात्र समाधान बचा है।
सेसिल करी

1
स्थानीय रूप से निर्यात करने के लिए, ध्यान दें कि क्लोन काम करने वाले पेड़ के पूर्ण पथ को file://प्रोटोकॉल (जैसे git clone --depth 1 --branch v3.14.15 file:///home/me/src_repo trg_repo) द्वारा उपसर्ग किया जाना चाहिए । ऐसा करने में असफलता "warning: --depth is ignored in local clones; use file:// instead."इस उत्तर के पूरे उद्देश्य को धता बताते हुए उथले क्लोन के बजाय एक मानक का उत्सर्जन और प्रदर्शन करेगी । Salud!
सेसिल करी

16

यह सभी सामग्री को कॉपी करेगा, .dot फ़ाइलों को घटाता है। मैं इसका उपयोग .it सामान के बिना अपने वेब ऐप के git रेपो में git क्लोन प्रोजेक्ट को निर्यात करने के लिए करता हूं।

cp -R ./path-to-git-repo / पथ / से / गंतव्य /

सादा पुराने बैश सिर्फ महान काम करता है :)


बस रिमोट से धक्का क्यों नहीं? बैश से भी सरल।
nurettin

2
उन फ़ाइलों के बारे में जो वेब एप्लिकेशन का हिस्सा हैं और इसका नाम डॉट से शुरू होता है? :) .htaccess के बारे में सोचें
Artur

3
कभी-कभी आप यह भी अनदेखा करना चाहते हैं कि इसमें क्या है .gitignore, यह नहीं होगा।
23

14

क्लोन के रूप में सरल के रूप में।

git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git


4
ईमानदारी से - यह उत्तर, जो प्रश्न में # 1 भी है - वह है जो आप 99% कर रहे हैं। इन जवाबों में से अधिकांश पागल अधूरा है।
ज्योफ निक्सन

11

GitHub उपयोगकर्ताओं के लिए, git archive --remoteविधि सीधे काम नहीं करेगी, क्योंकि निर्यात URL अल्पकालिक है । आपको URL के लिए GitHub से पूछना होगा, फिर उस URL को डाउनलोड करें। curlयह आसान बनाता है:

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -

यह आपको स्थानीय निर्देशिका में निर्यात कोड देगा। उदाहरण:

$ curl -L https://api.github.com/repos/jpic/bashworks/tarball | tar xzf -
$ ls jpic-bashworks-34f4441/
break  conf  docs  hack  LICENSE  mlog  module  mpd  mtests  os  README.rst  remote  todo  vcs  vps  wepcrack

संपादित करें
यदि आप चाहते हैं कि कोड एक विशिष्ट, मौजूदा निर्देशिका में रखा जाए (बजाय गीथूब से यादृच्छिक एक))

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | \
tar xzC /path/you/want --strip 1

11

हां, यह एक साफ-सुथरी और साफ-सुथरी कमांड है जो आपके कोड को संग्रह में शामिल किए बिना किसी भी git कमिटमेंट इतिहास के बारे में चिंता किए बिना पास करने के लिए अच्छा है।

git archive --format zip --output /full/path/to/zipfile.zip master 

यह बहुत अच्छा है, बस इसके बाद gitignore को हटाने की आवश्यकता है और इसे पूरा करने और साझा करने के लिए तैयार है।
सोगर

हटाने .gitgnore आदि को स्वीकृत उत्तर टिप्पणियों में उल्लिखित किया गया है: .gitattributes फ़ाइल का उपयोग करें, फीडिंग
posts/

10

मैं सिर्फ यह बताना चाहता हूं कि आप जिस मामले में हैं

  1. रिपॉजिटरी के एक उप फ़ोल्डर को निर्यात करना (यह है कि मैंने SVN निर्यात सुविधा का उपयोग कैसे किया)
  2. तैनाती फ़ोल्डर में उस फ़ोल्डर से सब कुछ कॉपी करने के साथ ठीक हैं
  3. और चूंकि आपके पास पहले से ही पूरे भंडार की एक प्रति है।

तो आप सिर्फ cp foo [destination]उल्लेख के बजाय उपयोग कर सकते हैं git-archive master foo | -x -C [destination]


9

आप ज़िप फ़ाइल के रूप में किसी भी प्रतिबद्ध पर एक दूरस्थ रेपो संग्रह कर सकते हैं।

git archive --format=zip --output=archive.zip --remote=USERNAME@HOSTNAME:PROJECTNAME.git HASHOFGITCOMMIT

8

बैश-गिट-निर्यात का कार्यान्वयन।

मैंने अपने स्वयं के फ़ंक्शन पर .empty फ़ाइल निर्माण और निष्कासन प्रक्रियाओं को खंडित किया है, जिसका उद्देश्य उन्हें 'गिट-आर्काइव' कार्यान्वयन में फिर से उपयोग करना है (बाद में पोस्ट किया जाएगा)।

मैंने लक्ष्य निर्यात फ़ोल्डर से अन-वॉन्टेड फ़ाइलों को हटाने के लिए '.gitattributes' फ़ाइल को भी प्रक्रिया में जोड़ा है। 'गिट-एक्सपोर्ट' फ़ंक्शन को और अधिक कुशल बनाते हुए प्रक्रिया में वर्बोसिटी शामिल करें।

EMPTY_FILE = "। खाली";

function create_empty () {
## Processing path (target-dir):
    TRG_PATH="${1}";
## Component(s):
    EXCLUDE_DIR=".git";
echo -en "\nAdding '${EMPTY_FILE}' files to empty folder(s): ...";
    find ${TRG_PATH} -not -path "*/${EXCLUDE_DIR}/*" -type d -empty -exec touch {}/${EMPTY_FILE} \;
#echo "done.";
## Purging SRC/TRG_DIRs variable(s):
    unset TRG_PATH EMPTY_FILE EXCLUDE_DIR;
    return 0;
  }

declare -a GIT_EXCLUDE;
function load_exclude () {
    SRC_PATH="${1}";
    ITEMS=0; while read LINE; do
#      echo -e "Line [${ITEMS}]: '${LINE%%\ *}'";
      GIT_EXCLUDE[((ITEMS++))]=${LINE%%\ *};
    done < ${SRC_PATH}/.gitattributes;
    GIT_EXCLUDE[${ITEMS}]="${EMPTY_FILE}";
## Purging variable(s):
    unset SRC_PATH ITEMS;
    return 0;
  }

function purge_empty () {
## Processing path (Source/Target-dir):
    SRC_PATH="${1}";
    TRG_PATH="${2}";
echo -e "\nPurging Git-Specific component(s): ... ";
    find ${SRC_PATH} -type f -name ${EMPTY_FILE} -exec /bin/rm '{}' \;
    for xRULE in ${GIT_EXCLUDE[@]}; do
echo -en "    '${TRG_PATH}/{${xRULE}}' files ... ";
      find ${TRG_PATH} -type f -name "${xRULE}" -exec /bin/rm -rf '{}' \;
echo "done.'";
    done;
echo -e "done.\n"
## Purging SRC/TRG_PATHs variable(s):
    unset SRC_PATH; unset TRG_PATH;
    return 0;
  }

function git-export () {
    TRG_DIR="${1}"; SRC_DIR="${2}";
    if [ -z "${SRC_DIR}" ]; then SRC_DIR="${PWD}"; fi
    load_exclude "${SRC_DIR}";
## Dynamically added '.empty' files to the Git-Structure:
    create_empty "${SRC_DIR}";
    GIT_COMMIT="Including '${EMPTY_FILE}' files into Git-Index container."; #echo -e "\n${GIT_COMMIT}";
    git add .; git commit --quiet --all --verbose --message "${GIT_COMMIT}";
    if [ "${?}" -eq 0 ]; then echo " done."; fi
    /bin/rm -rf ${TRG_DIR} && mkdir -p "${TRG_DIR}";
echo -en "\nChecking-Out Index component(s): ... ";
    git checkout-index --prefix=${TRG_DIR}/ -q -f -a
## Reset: --mixed = reset HEAD and index:
    if [ "${?}" -eq 0 ]; then
echo "done."; echo -en "Resetting HEAD and Index: ... ";
        git reset --soft HEAD^;
        if [ "${?}" -eq 0 ]; then
echo "done.";
## Purging Git-specific components and '.empty' files from Target-Dir:
            purge_empty "${SRC_DIR}" "${TRG_DIR}"
          else echo "failed.";
        fi
## Archiving exported-content:
echo -en "Archiving Checked-Out component(s): ... ";
        if [ -f "${TRG_DIR}.tgz" ]; then /bin/rm ${TRG_DIR}.tgz; fi
        cd ${TRG_DIR} && tar -czf ${TRG_DIR}.tgz ./; cd ${SRC_DIR}
echo "done.";
## Listing *.tgz file attributes:
## Warning: Un-TAR this file to a specific directory:
        ls -al ${TRG_DIR}.tgz
      else echo "failed.";
    fi
## Purgin all references to Un-Staged File(s):
   git reset HEAD;
## Purging SRC/TRG_DIRs variable(s):
    unset SRC_DIR; unset TRG_DIR;
    echo "";
    return 0;
  }

आउटपुट:

$ git-export /tmp/rel-1.0.0

खाली फ़ोल्डर के लिए '.empty' फाइलें जोड़ना: ... किया।

चेक-आउट इंडेक्स घटक (ओं): ... किया।

HEAD और इंडेक्स को रीसेट करना: ... किया।

जीआईटी-विशिष्ट घटक को शुद्ध करना: ...

'/tmp/rel-1.0.0/azing.buildpath}' फाइलें ... किया। '

'/tmp/rel-1.0.0/azing.project}' फ़ाइलें ... किया गया। '

'/tmp/rel-1.0.0/azing.gitignore}' फाइलें ... किया। '

'/tmp/rel-1.0.0/azing.git}' फाइलें ... किया। '

'/tmp/rel-1.0.0//hi.itattributes}' फाइलें ... किया। '

'/tmp/rel-1.0.0/azing*.mno}' फाइलें ... किया। '

'/tmp/rel-1.0.0/azing*~}' फाइलें ... किया। '

'/tmp/rel-1.0.0/azing.*~}' फाइलें ... किया। '

'/tmp/rel-1.0.0/azing*.swp}' फाइलें ... किया। '

/tmp/rel-1.0.0/azing*.swo} 'फाइलें ... किया।'

'/tmp/rel-1.0.0/azing.DS_Store}' फाइलें ... किया। '

'/tmp/rel-1.0.0/azing.settings}' फाइलें ... किया। '

'/tmp/rel-1.0.0/azing.empty}' फाइलें ... किया। '

किया हुआ।

संग्रहित चेक-आउट घटक (ओं): ... किया।

-rw-r - r-- 1 एडमिन व्हील 25445901 3 Nov 12:57 /tmp/rel-1.0.0Tgz

मैंने अब 'git संग्रह' कार्यक्षमता को एक एकल प्रक्रिया में शामिल किया है जो 'create_empty' फ़ंक्शन और अन्य सुविधाओं का उपयोग करता है।

function git-archive () {
    PREFIX="${1}"; ## sudo mkdir -p ${PREFIX}
    REPO_PATH="`echo "${2}"|awk -F: '{print $1}'`";
    RELEASE="`echo "${2}"|awk -F: '{print $2}'`";
    USER_PATH="${PWD}";
echo "$PREFIX $REPO_PATH $RELEASE $USER_PATH";
## Dynamically added '.empty' files to the Git-Structure:
    cd "${REPO_PATH}"; populate_empty .; echo -en "\n";
#    git archive --prefix=git-1.4.0/ -o git-1.4.0.tar.gz v1.4.0
# e.g.: git-archive /var/www/htdocs /repos/domain.name/website:rel-1.0.0 --explode
    OUTPUT_FILE="${USER_PATH}/${RELEASE}.tar.gz";
    git archive --verbose --prefix=${PREFIX}/ -o ${OUTPUT_FILE} ${RELEASE}
    cd "${USER_PATH}";
    if [[ "${3}" =~ [--explode] ]]; then
      if [ -d "./${RELEASE}" ]; then /bin/rm -rf "./${RELEASE}"; fi
      mkdir -p ./${RELEASE}; tar -xzf "${OUTPUT_FILE}" -C ./${RELEASE}
    fi
## Purging SRC/TRG_DIRs variable(s):
    unset PREFIX REPO_PATH RELEASE USER_PATH OUTPUT_FILE;
    return 0;
  }

उपयोग: git- संग्रह [/ var / www / htdocs] /repos/web.domain/website:rel-1.0.0
tocororo

8

यदि आप ऐसा कुछ चाहते हैं जो सबमॉड्यूल्स के साथ काम करता है तो यह मूल्य हो सकता है।

ध्यान दें:

  • MASTER_DIR = अपने सबमॉडल्स के साथ एक चेकआउट भी चेक आउट किया
  • DEST_DIR = जहाँ यह निर्यात समाप्त होगा
  • यदि आपके पास rsync है, तो मुझे लगता है कि आप कम गेंद के साथ भी ऐसा ही कर पाएंगे।

मान्यताओं:

  • आपको इसे MASTER_DIR (यानी MASTER_DIR cd .. से मूल निर्देशिका) से चलाने की आवश्यकता है
  • DEST_DIR को बनाया गया माना जाता है। यदि आप चाहते थे तो DEST_DIR के निर्माण को शामिल करना संशोधित करना बहुत आसान है

cd MASTER_DIR && tar -zcvf ../DEST_DIR/export.tar.gz --exclude = '। git *'। && cd ../DEST_DIR/ && tar xvfz export.tar.gz && rm export.tar.gz


6

मेरी प्राथमिकता वास्तव में एक डिस्ट का होना होगा अपने Makefile में लक्ष्य (या अन्य निर्माण प्रणाली) है कि निर्यात के लिए अपने कोड (.tar.bz2, .zip, .jar, या जो कुछ भी उचित है) की एक वितरण योग्य संग्रह। यदि आप जीएनयू ऑटोटूल या पर्ल के मेकमेकर सिस्टम का उपयोग करते हैं, तो मुझे लगता है कि यह आपके लिए स्वचालित रूप से मौजूद है। यदि नहीं, तो मैं इसे जोड़ने की अत्यधिक सलाह देता हूं।

ETA (2012-09-06): वाह, कठोर डाउनवोट्स। मेरा अब भी मानना ​​है कि अपने सोर्स कोड कंट्रोल टूल के बजाय अपने बिल्ड टूल्स के साथ अपने डिस्ट्रिब्यूशन को बनाना बेहतर है। मैं निर्माण उपकरणों के साथ कलाकृतियों के निर्माण में विश्वास करता हूं। मेरी वर्तमान नौकरी में, हमारा मुख्य उत्पाद एक चींटी लक्ष्य के साथ बनाया गया है। हम स्विचिंग सोर्स कोड कंट्रोल सिस्टम के बीच में हैं, और इस चींटी लक्ष्य की उपस्थिति का मतलब प्रवास में एक कम परेशानी है।


मेरे मन में जो प्रोजेक्ट था वह कोड प्रोजेक्ट नहीं था; यह एक वेब साइट परियोजना की तर्ज पर अधिक होता है।
५३ पर ग्रेग हेवगिल

सवाल का जवाब नहीं देता।
एंड्रयू फेरियर

1
हाँ, इस तरह के उत्तर से हर किसी की ज़रूरतें पूरी नहीं हो सकती हैं, लेकिन नकारात्मकता विचित्र है। यह है , केवल सही जवाब कई स्थितियों में एक पूरी तरह से वैध जवाब है, और वास्तव में,। यह बहुत ही मान्य बिंदु बनाता है कि इस मुद्दे के बारे में "vc टूल इशू" के रूप में सोचने से अक्सर गलत रास्ते पूरी तरह से खत्म हो जाते हैं।
स्नोगलथॉर्प

6

यह फ़ाइलों को कमिट (C से G) की एक टेर फ़ाइल में कॉपी करेगा। नोट: यह केवल फाइल शुरू हो जाएगी। संपूर्ण रिपॉजिटरी नहीं। से थोड़ा संशोधितयहाँ

उदाहरण प्रतिबद्ध इतिहास

ए -> बी -> सी -> डी -> ई -> एफ -> जी -> एच -> मैं

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT C~..G | xargs tar -rf myTarFile.tar

गिट-डिफरेंस-ट्री मैनुअल पेज

-आर -> उप-पेड़ों में पुनरावृत्ति

- कोई कमेटी-आईडी -> गिट डिफरेंस ट्री लागू होने पर कमिट आईडी के साथ एक लाइन आउटपुट करता है। इस झंडे ने प्रतिबद्ध आईडी आउटपुट को दबा दिया।

--name-only -> केवल परिवर्तित फ़ाइलों के नाम दिखाएं।

--diff- फ़िल्टर = ACMRT -> केवल इन फ़ाइलों का चयन करें। फाइलों की पूरी सूची के लिए यहां देखें

C..G -> कमिट की इस श्रेणी की फाइलें

सी ~ -> कमिट सी से फाइलें शामिल करें। सी के बाद से फाइल ही नहीं।

| xargs tar -rf myTarFile -> टैरो को आउटपुट


5

जैसा कि मैं प्रश्न को समझता हूं, यह सर्वर से केवल निश्चित राज्य को डाउनलोड करने के बारे में अधिक है, इतिहास के बिना, और अन्य शाखाओं के डेटा के बिना, स्थानीय रिपॉजिटरी से राज्य निकालने के बजाय (जैसा कि यहां कई ऐनर करते हैं)।

इस तरह किया जा सकता है:

git clone -b someBranch --depth 1 --single-branch git://somewhere.com/repo.git \
&& rm -rf repo/.git/
  • --single-branch Git 1.7.10 (अप्रैल 2012) से उपलब्ध है।
  • --depthहै (था?) कथित तौर पर दोषपूर्ण है, लेकिन एक निर्यात के मामले के लिए, उल्लेख किया मुद्दों बात नहीं करना चाहिए।

नोट: मैंने अभी देखा कि वहाँ awsers के 2 पृष्ठ हैं, मैंने केवल पोस्ट करने से पहले एक को देखा। केवल उसी के साथ एक समान अन्वेषक है --depth, जिसका अर्थ है --single-branchजब तक --no-single-branchकि दिया नहीं जाता है, जिसका अर्थ है कि इसका संभवतः समान प्रभाव है। हालांकि यकीन नहीं है, कुछ विशेषज्ञ पुष्टि कर सकते हैं?
ओन्ड्रा kaयूस्का

4

मुझे एक तैनात स्क्रिप्ट के लिए इसकी आवश्यकता थी और मैं उपर्युक्त दृष्टिकोणों में से किसी का भी उपयोग नहीं कर सकता था। इसके बजाय मैंने एक अलग समाधान निकाला:

#!/bin/sh
[ $# -eq 2 ] || echo "USAGE $0 REPOSITORY DESTINATION" && exit 1
REPOSITORY=$1
DESTINATION=$2
TMPNAME="/tmp/$(basename $REPOSITORY).$$"
git clone $REPOSITORY $TMPNAME
rm -rf $TMPNAME/.git
mkdir -p $DESTINATION
cp -r $TMPNAME/* $DESTINATION
rm -rf $TMPNAME

रीड-ट्री / चेकआउट-इंडेक्स या आर्काइव समाधान के साथ क्या समस्या थी? जहां तक ​​मैं बता सकता हूं कि आपने कुछ के बराबर किया है, mkdir -p "$2" && git --git-dir="$1" archive HEAD | tar -x -C "$2"लेकिन कुछ हद तक घुमावदार है।
CB Bailey

1
मुझे दूरस्थ रिपॉजिटरी से काम करने के लिए रीड-ट्री नहीं मिल सका, और संग्रह समाधान github के साथ काम नहीं करता है।
ट्रूल्सकॉन

हां संग्रह के साथ एक अमान्य आदेश मिलता है: 'git-upload-आर्काइव' ... त्रुटि और मेरे पास core.gitProxy config विकल्प नहीं है और GIT_PROXY_COMMAND पर्यावरण चर सेट
tgkprog

4

यह आसान तरीका है, यह .bash_profile के लिए एक फ़ंक्शन है, यह सीधे वर्तमान स्थान पर संग्रह को खोल देता है, पहले अपने सामान्य [url: path] को कॉन्फ़िगर करें। नोट: इस फ़ंक्शन के साथ आप क्लोन ऑपरेशन से बचते हैं, यह सीधे रिमोट रेपो से मिलता है।

gitss() {
    URL=[url:path]

    TMPFILE="`/bin/tempfile`"
    if [ "$1" = "" ]; then
        echo -e "Use: gitss repo [tree/commit]\n"
        return
    fi
    if [ "$2" = "" ]; then
        TREEISH="HEAD"
    else
        TREEISH="$2"
    fi
    echo "Getting $1/$TREEISH..."
    git archive --format=zip --remote=$URL/$1 $TREEISH > $TMPFILE && unzip $TMPFILE && echo -e "\nDone\n"
    rm $TMPFILE
}

.Iasconfig के लिए उपनाम, समान कॉन्फ़िगरेशन की आवश्यकता है (TAKE CARE कमांड को निष्पादित करने के लिए। Init प्रोजेक्ट्स, यह हमेशा पहले बताए गए आधार dir पर कूदता है , जब तक कि यह तय नहीं हो जाता है, मैं व्यक्तिगत रूप से फ़ंक्शन पसंद करता हूं

ss = !env GIT_TMPFILE="`/bin/tempfile`" sh -c 'git archive --format=zip --remote=[url:path]/$1 $2 \ > $GIT_TMPFILE && unzip $GIT_TMPFILE && rm $GIT_TMPFILE' -

4

अब तक का सबसे आसान तरीका जो मैंने देखा है, वह है (और विंडोज़ पर भी काम करता है) git bundle:

git bundle create /some/bundle/path.bundle --all

अधिक जानकारी के लिए इस उत्तर को देखें: मैं अपनी विंडोज़ मशीन से अपने लिनक्स रिपॉजिटरी को यूएसबी ड्राइव के माध्यम से लिनक्स मशीन पर कैसे कॉपी कर सकता हूं?


git bundle.gitफ़ोल्डर को शामिल करता है , जो ओपी नहीं चाहता है; git archiveअधिक उपयुक्त तरीका लगता है
ssc

--allस्विच पर प्रलेखन कहां है ?
विल्सन

4

मेरे पास एक और समाधान है जो ठीक काम करता है यदि आपके पास मशीन पर रिपॉजिटरी की एक स्थानीय प्रतिलिपि है जहां आप निर्यात बनाना चाहते हैं। इस मामले में इस रिपॉजिटरी डायरेक्टरी में जाएं, और इस कमांड को दर्ज करें:

GIT_WORK_TREE=outputdirectory git checkout -f

यह विशेष रूप से उपयोगी है यदि आप एक वेबसाइट को एक git रिपॉजिटरी के साथ प्रबंधित करते हैं और एक स्वच्छ संस्करण को चेकआउट करना चाहते हैं /var/www/। इस स्थिति में, इस .git/hooks/post-receiveस्क्रिप्ट को स्क्रिप्ट में जोड़ें ( hooks/post-receiveनंगे भंडार पर, जो इस स्थिति में अधिक उपयुक्त है)


3

मुझे लगता है कि @Aredridel का पद सबसे नज़दीक था, लेकिन इसके लिए थोड़ा अधिक है - इसलिए मैं इसे यहाँ जोड़ूंगा ; बात यह है कि svn, यदि आप एक रेपो के सबफ़ोल्डर में हैं, और आप करते हैं:

/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir

फिर svnसभी फाइलें जो कि संशोधन नियंत्रण में हैं (वे नए सिरे से जोड़ सकते हैं; या संशोधित स्थिति) - और यदि आपके पास उस निर्देशिका में अन्य "जंक" है (और मैं .svnयहां सबफ़ोल्डर्स की गिनती नहीं कर रहा हूं , लेकिन .oफाइलों की तरह दिखाई देने वाला सामान निर्यात करेगा ) , यह निर्यात नहीं किया जाएगा; एसवीएन रेपो द्वारा पंजीकृत केवल उन फाइलों को निर्यात किया जाएगा। मेरे लिए, एक अच्छी बात यह है कि इस निर्यात का भी स्थानीय परिवर्तन है कि है के साथ फ़ाइलें शामिल है नहीं अभी तक किया गया; और एक और अच्छी बात यह है कि निर्यात की गई फाइलों का टाइमस्टैम्प मूल के समान ही हैं। या, जैसा svn help exportकि यह कहते हैं:

  1. PATH1 द्वारा निर्दिष्ट कार्य प्रति से एक साफ निर्देशिका वृक्ष का निर्यात करता है, यदि संशोधन दिया गया है, तो अन्यथा संशोधन पर, PATH2 में। ... यदि REV निर्दिष्ट नहीं है, तो सभी स्थानीय परिवर्तन संरक्षित किए जाएंगे। वर्जन कंट्रोल में नहीं आने वाली फाइलों को कॉपी नहीं किया जाएगा।

यह समझने के लिए कि gitटाइमस्टैम्प संरक्षित नहीं करेंगे, इन कमांड के आउटपुट की तुलना करें ( gitअपनी पसंद के रेपो के सबफ़ोल्डर में ):

/media/disk/git_svn/subdir$ ls -la .

... तथा:

/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)

... और मैं, किसी भी मामले में, ध्यान दें कि git archiveसंग्रहीत फ़ाइल के सभी टाइमस्टैम्प समान होने का कारण बनता है! git help archiveकहते हैं:

git अर्काइव तब अलग तरीके से व्यवहार करता है जब एक वृक्ष ID बनाम जब एक प्रतिबद्ध ID या टैग ID दिया जाता है। पहले मामले में संग्रह में प्रत्येक फ़ाइल के संशोधन समय के रूप में वर्तमान समय का उपयोग किया जाता है। उत्तरार्द्ध मामले में संदर्भित कमिट ऑब्जेक्ट में दर्ज किए गए प्रतिबद्ध समय का उपयोग इसके बजाय किया जाता है।

... लेकिन स्पष्ट रूप से दोनों मामलों में " प्रत्येक फ़ाइल का संशोधन समय" निर्धारित किया गया है ; जिससे उन फ़ाइलों के वास्तविक टाइमस्टैम्प को संरक्षित नहीं किया जा सकता है !

इसलिए, टाइमस्टैम्प को संरक्षित करने के लिए, यहां एक bashस्क्रिप्ट है, जो वास्तव में "वन-लाइनर" है, भले ही कुछ जटिल हो - इसलिए नीचे इसे कई लाइनों में पोस्ट किया गया है:

/media/disk/git_svn/subdir$ git archive --format=tar master | (tar tf -) | (\
  DEST="/media/diskC/tmp/subdirB"; \
  CWD="$PWD"; \
  while read line; do \
    DN=$(dirname "$line"); BN=$(basename "$line"); \
    SRD="$CWD"; TGD="$DEST"; \
    if [ "$DN" != "." ]; then \
      SRD="$SRD/$DN" ; TGD="$TGD/$DN" ; \
      if [ ! -d "$TGD" ] ; then \
        CMD="mkdir \"$TGD\"; touch -r \"$SRD\" \"$TGD\""; \
        echo "$CMD"; \
        eval "$CMD"; \
      fi; \
    fi; \
    CMD="cp -a \"$SRD/$BN\" \"$TGD/\""; \
    echo "$CMD"; \
    eval "$CMD"; \
    done \
)

ध्यान दें कि यह माना जाता है कि आप "वर्तमान" निर्देशिका (ऊपर /media/disk/git_svn/subdir) में सामग्री निर्यात कर रहे हैं - और जिस गंतव्य में आप निर्यात कर रहे हैं वह कुछ हद तक असुविधाजनक है, लेकिन यह DESTपर्यावरण चर में है। ध्यान दें कि इस स्क्रिप्ट के साथ; आपको बनाना होगाDESTउपरोक्त स्क्रिप्ट चलाने से पहले, आपको मैन्युअल रूप निर्देशिका स्वयं ।

स्क्रिप्ट के चलने के बाद, आपको तुलना करने में सक्षम होना चाहिए:

ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB   # DEST

... और उम्मीद है कि समान टाइमस्टैम्प (उन फ़ाइलों के लिए जो संस्करण नियंत्रण में थे)।

आशा है कि यह किसी की मदद करता है,
चीयर्स!


3

प्रीफ़िक्स (उदाहरण निर्देशिका नाम) जोड़ते हुए ज़िप संग्रह पर एक git निर्यात:

git archive master --prefix=directoryWithinZip/  --format=zip -o out.zip

2

यदि आपको सबमॉड्यूल की आवश्यकता है, तो यह चाल चलनी चाहिए: https://github.com/meitar/git-archive-all.sh/wiki


दरअसल, ऐसा लगता है कि इसमें कुछ छोटे मुद्दे हैं, इसलिए यह प्राइम टाइम के लिए तैयार नहीं हो सकता है।
ब्रैंडन

1

मेरे पास मेरे .bashrc फ़ाइल में निम्नलिखित उपयोगिता फ़ंक्शन है: यह एक गिट रिपॉजिटरी में वर्तमान शाखा का एक संग्रह बनाता है।

function garchive()
{
  if [[ "x$1" == "x-h" || "x$1" == "x" ]]; then
    cat <<EOF
Usage: garchive <archive-name>
create zip archive of the current branch into <archive-name>
EOF
  else
    local oname=$1
    set -x
    local bname=$(git branch | grep -F "*" | sed -e 's#^*##')
    git archive --format zip --output ${oname} ${bname}
    set +x
  fi
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.