नेस्टेड गिट रिपोजिटरी?


181

क्या मैं Git रिपॉजिटरी को घोंसला बना सकता हूं? मेरे पास है:

 /project_root/
 /project_root/my_project
 /project_root/third_party_git_repository_used_by_my_project

क्या यह स्थानीय स्तर पर हर चीज के प्रबंधन को आसान बनाने के लिए समझदारी का काम git init/addकरता /project_rootहै या मुझे my_projectअलग से थर्ड पार्टी को मैनेज करना पड़ता है ?

जवाबों:


159

आप सबमॉडल्स नामक Git फीचर की तलाश में हो सकते हैं । यह सुविधा आपको निर्भर रिपॉजिटरी का प्रबंधन करने में मदद करती है जो आपके मुख्य भंडार के अंदर निहित हैं।


43
एक रिश्तेदार गिट शुरुआत के रूप में, मैंने chrisjean.com/2009/04/20/20 को समझने के लिए इस ब्लॉग / ट्यूटोरियल को आसान पाया। यह सहायक शेल स्क्रिप्ट के संदर्भ के बजाय सिर्फ गिट पर ध्यान केंद्रित करके एक सरल दृष्टिकोण लेता है; मुझे पढ़ना आसान लगा।
जॉन के

4
Chrisjean.com ब्लॉग वर्तमान का अनुसरण करने की कोशिश करने के आधार पर वर्तमान नहीं लगता है। ग्रेग से विकी पद थोड़ा और अधिक जटिल हो सकता है, लेकिन एक नौसिखिया नौसिखिया के रूप में मैं सटीक सटीक पसंद करता हूं ...
ऋषि

ब्लॉग अब ठीक काम करने लगता है, और दुर्भाग्य से ऋषि के लिए, टिप्पणी पर 34 (अब 35) अप वोट इस बात से सहमत हैं कि ब्लॉग लेख में एक मूल्य है। स्पष्टता और संचालन-विशिष्ट सलाह के लिए आपको सटीकता का त्याग करने की आवश्यकता नहीं है। इसे पढ़ने के बाद, मुझे लगता है कि लेखक ने पहले से ही थोड़ा शोध किया था और शायद वास्तविक Git प्रलेखन को पढ़ा था , न कि केवल कर्नेल.ऑर्कि पेज। एक पूरी तरह से प्रासंगिक उदाहरण में ब्लॉग लेखक की गिट-उन्मुख व्याख्या व्यक्तियों की एक बड़ी संख्या के लिए काफी मददगार लगती है ...
मैथ्यू वेबर

13
BTW कि ऊपर उल्लिखित क्रिसंज लिंक मृत है। अद्यतन लिंक chrisjean.com/git-submodules-adding-use-removing-and-updating
sprksh

35

अपने तीसरे पक्ष के पुस्तकालयों को एक अलग भंडार में रखें और उन्हें मुख्य परियोजना के साथ जोड़ने के लिए सबमॉड्यूल्स का उपयोग करें। यहाँ एक चलना है:

http://git-scm.com/book/en/Git-Tools-Submodules

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


22

पूर्णता के लिए:

एक और उपाय है, मैं सुझाऊंगा : सबट्री मर्जिंग

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

$ git remote add -f OtherRepository /path/to/that/repo
$ git merge -s ours --no-commit OtherRepository/master
$ git read-tree --prefix=AnyDirectoryToPutItIn/ -u OtherRepository/master
$ git commit -m "Merge OtherRepository project as our subdirectory"`

फिर, अन्य रिपॉजिटरी को अपनी निर्देशिका में खींचने के लिए (इसे अपडेट करने के लिए), सबट्री मर्ज रणनीति का उपयोग करें:

$ git pull -s subtree OtherRepository master

मैं इस विधि का उपयोग वर्षों से कर रहा हूँ, यह काम करता है :-)

इस तरह के बारे में उप मॉड्यूल के साथ तुलना करने सहित इस git howto डॉक्टर में पाया जा सकता है ।


गिट बुक में उप-मर्जिंग संदर्भ अब काम नहीं करता है। वर्तमान में, यह लिंक प्रतीत होता है: git-scm.com/book/en/v2/…
ericx

18

आप जोड़ सकते हैं

/project_root/third_party_git_repository_used_by_my_project

सेवा

/project_root/.gitignore

कि नेस्टेड रेपो को माता-पिता रेपो में शामिल करने से रोकना चाहिए, और आप उनके साथ स्वतंत्र रूप से काम कर सकते हैं।

लेकिन: यदि कोई उपयोगकर्ता पेरेंट रेपो में git क्लीन -dfx चलाता है, तो यह अनदेखा नेस्टेड रेपो को हटा देगा। एक और तरीका है फ़ोल्डर को सिमिलिंक करना और सिम्लिंक को अनदेखा करना। यदि आप गिट क्लीन चलाते हैं, तो सिमलिंक हटा दिया जाता है, लेकिन 'नेस्टेड' रेपो बरकरार रहेगा क्योंकि यह वास्तव में कहीं और रहता है।


14

git-subtree आपको एक ही पेड़ में कई परियोजनाओं के साथ काम करने में मदद करेगा और उनके लिए अलग-अलग इतिहास रखेगा।


3
इस सुविधा को बाद में Git में मिला दिया गया है। यहाँ एक अच्छा वर्णन है: developer.atlassian.com/blog/2015/05/the-power-of-git-subtree
nobar

5

सारांश।

क्या मैं git रिपॉजिटरी को घोंसला बना सकता हूं?

हाँ। हालाँकि, डिफ़ॉल्ट रूप से git .gitनेस्टेड रिपॉजिटरी के फ़ोल्डर को ट्रैक नहीं करता है। Git में नेस्टेड रिपॉजिटरी (पढ़ें) का प्रबंधन करने के लिए डिज़ाइन की गई विशेषताएं हैं।

क्या स्थानीय रूप से हर चीज के प्रबंधन को आसान बनाने के लिए init को git / add / project_root से जोड़ने का कोई मतलब है या मुझे my_project और 3rd पार्टी को अलग से प्रबंधित करना है?

यह शायद समझ में नहीं आता क्योंकि git में नेस्टेड रिपॉजिटरी को प्रबंधित करने की विशेषताएं हैं। एनआईटी रिपॉजिटरी का प्रबंधन करने के लिए गिट्स में निर्मित विशेषताएं हैं submoduleऔर subtree

यहां विषय पर एक ब्लॉग है और यहां एक SO प्रश्न है जो प्रत्येक का उपयोग करने के पेशेवरों और विपक्षों को कवर करता है।


2

मैं प्रति प्रोजेक्ट एक रिपॉजिटरी का उपयोग करूंगा। इस तरह, इतिहास को ब्राउज़ करना आसान हो जाता है।

मैं तीसरे पक्ष के पुस्तकालय के संस्करण की भी जांच करूंगा, जिसका उपयोग कर रहा हूं, परियोजना के भंडार में इसका उपयोग कर रहा हूं।

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