2011-09-21 12 views
13

मेरे पास एक गिट रिपोजिटरी है जो एक सबमिशन का उपयोग करता है जिसे मैं एक एनोटेटेड टैग पर इंगित करना चाहता हूं, लेकिन जब मैं git submodule update करता हूं तो नए टैग नहीं मिलते हैं। मैं submodule में सीडी-इंग और वहाँ एक git fetch --tags करके submodule में नए टैग प्राप्त कर सकते हैं, लेकिन मैं वास्तव में बाहर से यह सब करने के लिए के रूप में यह पटकथा है चाहते हैं।पनडुब्बियों में टैग लाने के लिए गिट सबमिशन अपडेट किया जा सकता है?

मुझे टैग्स (मेरा गिट संस्करण 1.7.3.5) शामिल करने के लिए git submodule update प्राप्त करने का एक तरीका सुझाते हुए गिट दस्तावेज़ों में कुछ भी नहीं मिला है।

स्पष्ट रूप से एक और संभावना है - टैग की बजाय टैग को इंगित करने वाले प्रतिबद्धता पर सबमिशन को इंगित करने के लिए, लेकिन यह साफ नहीं लगता है।

क्या टैग शामिल करने के लिए git submodule update प्राप्त करने का कोई तरीका है?

उत्तर

6

git submodule एक खोल स्क्रिप्ट के रूप में कार्यान्वित किया जाता है, तो यह देखने के लिए कि यह क्या कर रहा है आसान है - यह /usr/lib/git-core/git-submodule में हो सकता है आप एक पैक संस्करण का उपयोग कर रहे हैं। मूलतः यह सिर्फ submodule अगर यह वस्तु का नाम (sha1sum) मुख्य परियोजना के पेड़ संस्करण से मेल नहीं खाता में जमा हो जाती submodule में बाहर की जाँच की, Koraktor points out के रूप में git-fetch चलाता है।

documentation for git fetch (या man git-fetch जबकि kernel.org नीचे है) का कहना है कि यह हर टैग जो डाउनलोड किए वस्तु की ओर इशारा करता लाने चाहिए, और डाउनलोड की वस्तुओं में शामिल होंगे हर प्रतिबद्ध है कि हर शाखा है, जो प्राप्त किया गया है के एक पूर्वज है। इसका मतलब है कि यह मेरे लिए आश्चर्य की बात है कि आपको git submodule update पर सभी प्रासंगिक टैग नहीं मिलते हैं।

यदि ऐसा है कि आप वास्तव में चाहते हैं कि आपकी स्क्रिप्ट के लिए एक नया सबमिशन संस्करण सेट करने का प्रयास करें और परिणाम न दें, तो मुझे नहीं लगता कि git submodule update वह टूल है जो आप चाहते हैं - यह सुनिश्चित करने के लिए है कि वर्तमान में मुख्य परियोजना के प्रतिबद्धता के आधार पर आपके सबमिड्यूल सही संस्करण पर हैं। इसके बजाय आप बस की तरह कुछ करना चाहिए:

(cd my-submodule && \ 
     git fetch && \ 
     git fetch --tags && \ 
     git checkout my-tag) 
git add my-submodule 
git commit -m 'Update the submodule to the "my-tag" version' my-submodule 

(मैं एक अतिरिक्त git fetch --tagsjust in case अपने टैग जोड़ा एक जो डाउनलोड करने के लिए अंक नहीं है।)

जाहिर है एक और संभावना है - कम से submodule बात करने के लिए प्रतिबद्ध है जो टैग अंक के बजाय टैग से भी है, लेकिन इस के रूप में साफ प्रतीत नहीं होता।

ठीक है, केवल एक चीज है कि submodule के लिए मुख्य परियोजना के पेड़ में संग्रह किया गया है सिर्फ प्रतिबद्ध वस्तु के हैश है, इसलिए भले ही एक आदेश है कि ने कहा, "कि submodule में टैग my-tag करने के लिए अपने submodule सेट थे ", यह वैसे भी उस टैग के अनुरूप हैश को संग्रहीत करेगा ...

+0

आपकी सभी मदद के लिए धन्यवाद - ऐसा लगता है कि मेरी समस्या यह है कि जो प्रतिबद्धता मैं चाहता था वह किसी भी शाखा के इतिहास में नहीं है। क्या आपको लगता है कि एक अच्छा कारण है कि 'गिट सबमिशन अपडेट' केवल 'गिट फ़ेच' करता है, न कि 'गिट फ़ेच --टैग'? 'गिट फ़ेच - टैग्स' जोड़ना इस समस्या को भविष्य में आने वाले किसी भी व्यक्ति के लिए सॉर्ट करेगा। जब kernel.org बैक अप लेता है तो मुझे इसकी रिपोर्ट करने के लिए कहीं मिल जाएगा। –

+1

@ डंकनपार्क्स गिट शुरू करना 1.9/2.0 (क्यू 1 2014), 'गिट फ़ेच --टैग' पर्याप्त होगा ('गिट फ़ेच' जोड़ने की कोई आवश्यकता नहीं है): http://stackoverflow.com/a/20608181/6309 – VonC

0

आप स्क्रिप्ट यह कर सकते हैं, ताकि आप एक (cd path-to-submod && git fetch)

कोष्ठक में आदेशों लपेटकर एक subshell, अर्थ में पर्यावरण डालता है, तो आप वापस तुम कहाँ थे करने के लिए बाहर सीडी की जरूरत नहीं है।

आशा इस

3

git submodule update में मदद करता है कुछ भी लाने नहीं है कि आपके submodules अप-टू-डेट कर रहे हैं। तो यह एक गलतफहमी हो सकती है।

git submodule update परिभाषित स्थिति में आपके भंडार में submodules की कार्यशील निर्देशिका सामग्री लाएगा (यानी आपके भंडार में परिभाषित सबमिशन प्रतिबद्धता देखें)।

एक बेहतर तरीका अपने submodule में cd होगा (जो एक Git भंडार ही है) और बस git fetch --tags और फिर git checkout some-tag चलाते हैं। उसके बाद submodule some-tag को अपने काम की निर्देशिका में अद्यतन किया गया है और आप करने के लिए यह मंच प्रदान करता है।

+0

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

13

देर से उत्तर दें, लेकिन मुझे आश्चर्य है कि कोई भी git submodule foreach का उल्लेख नहीं करता है। यह मूल रूप से जिस तरह से मैं सटीक समस्या हल आप का सामना करना पड़ा है:

git submodule foreach --recursive 'git fetch --tags' 
git submodule update --recursive 

--recursive झंडा बच्चे submodules में recurse करने होती है।

संबंधित मुद्दे