2011-03-24 11 views
5

मेरे पास एक मर्कुरियल रिपोजिटरी है, और बिना किसी समस्या के जोड़ा गया है git subrepo (hg 1.8)।एक गिट सबरेपो का उपयोग करना जिसमें एक मर्कुरियल रिपोजिटरी में एक और गिट सबरेपो है, क्या यह संभव है?

समस्या है: इस Git subrepo ही अंदर एक और Git subrepository है और यह खींच लिया जाता है नहीं किया जा रहा है (यह Git के subrepo .gitmodules फ़ाइल में है), जब तक कि मैं अपने Git subrepo पर एक git clone --recursive कार्य करें: इस तरह से यह काम करता है कर।

समस्या: मैं एक और मशीन में अपने भंडार में एक hg pull, यह git subrepo खींचती है, लेकिन यह .gitmodules खींच नहीं करता है। .gitmodules केवल दूसरी मशीन में खींचा गया था जब मैंने git clone --recursive किया था।

क्या किसी के पास इस स्थिति को संभालने के लिए कोई सुझाव है? बदसूरत समाधान git clone करना है और बस मेरे Mercurial भंडार में सभी फ़ाइलों (गिट मेटाडाटा सहित) जोड़ें, बिना subrepo की तरह अभिनय किए।

उत्तर

3

मुझे लगता है सबसे अच्छा ठीक मर्क्युरियल के Git subrepository समर्थन पैच करने के लिए (जैसे git clone --recursive जब एक अद्यतन Git आधारित subrepository, आदि खींचने के बाद एक Git आधारित subrepository, git pull --recurse-submodules && git submodule update क्लोनिंग) हमेशा Git के पुनरावर्ती विकल्पों का उपयोग करना होगा। मुझे पता है कि गिट डेवलपर्स ने विशेष रूप से स्वचालित रूप से पनडुब्बियों को प्रारंभ नहीं करना चुना क्योंकि वे वर्कफ़्लो में से एक का समर्थन करना चाहते हैं, "मैं कभी भी किसी भी सबोडोजिटरी को देखना नहीं चाहता हूं", लेकिन हो सकता है कि "हमेशा सभी सब्रेस्पिटोरीज़ शुरू करें" एक बेहतर मैच है ऑपरेशन के डिफ़ॉल्ट Mercurial मोड (मैं एक Mercurial उपयोगकर्ता का अधिक नहीं हूँ, तो मुझे डिफ़ॉल्ट Mercurial शैली क्या होगा के बारे में एक अच्छा विचार नहीं है)।


तक ऐसा होता है, आप .hgsub प्रविष्टियों में subrepo/.gitmodules प्रविष्टियों का अनुवाद द्वारा समस्या को हल करने में सक्षम हो सकता है। मैन्युअल रूप से करना आसान है, लेकिन यदि संभव हो तो आप इसे स्वचालित कर सकते हैं (का उपयोग .git/config और/या .gitmodules से पथ और यूआरएल निकालने के लिए करें)। यदि आप .gitmodules फ़ाइल से अधिक व्यवहार कर रहे हैं तो यह अपरिहार्य हो सकता है जो बहुत अधिक बदलता है (.gitmodules प्रत्येक बार .hgsub सिंक्रनाइज़ करने के बारे में आपको बहुत मेहनत करनी होगी)।

मैं चार खजाने के साथ इस परीक्षण किया: - एक "पत्ता" भंडार (कोई Git submodules)

  • gitsuper -

    • gitsub एक Git "superproject";
      gitsub/ एक submodule
    • hgsuper2 रूप gitsub है - एक मर्क्युरियल "superproject";
      gitsuper/gitsuper एक subrepository रूप है,
      gitsuper/gitsub एक subrepository रूप gitsub है।
    • hgsuper2 क्लोन - एक क्लोन मर्क्युरियल "superproject";
      gitsuper/gitsuper एक subrepository रूप है,
      gitsuper/gitsub एक subrepository रूप gitsub है।

    मैं बनाया गया है और इस तरह से उन्हें परीक्षण किया:

    1. gitsub बनाएँ। कुछ सामग्री जोड़ें और प्रतिबद्ध करें।
    2. gitsuper बनाएँ।
      1. कुछ सामग्री जोड़ें।
      2. git submodule add url-of-gitsub gitsub && git submodule init
      3. git commit -m 'added gitsub'
    3. hgsuper2 बनाएँ।
      1. कुछ सामग्री जोड़ें।
      2. git clone --recursive url-of-gitsuper gitsuper
      3. echo 'gitsuper = [git]url-of-gitsuper' >> .hgsub
      4. echo 'gitsuper/gitsub = [git]url-of-gitsub' >> .hgsub
        ये आखिरी दो चरणों gitsuper/.git/config और gitsuper/.gitmodules के टुकड़े से स्वचालित किया जा सकता है।
      5. hg add .hgsub && hg commit -m 'added Git subrepositories'
    4. क्लोन से hgsuper2hgsuper2 क्लोन
      यह gitsuper/ और gitsuper/gitsub/ में उचित सामग्री हो जाता है।
    5. अद्यतन और gitsub नई सामग्री के लिए प्रतिबद्ध।
    6. अद्यतन gitsuper
      1. जोड़ें या कुछ सामग्री को बदलने और इसे को करते हैं।
      2. (cd gitsub && git pull origin master)
      3. git add gitsub && git commit -m 'updated gitsuper content (also gitsub)'
    7. hgsuper2 में, Git suprepositories से परिवर्तन खींच।
      1. (cd gitsuper && git pull --recurse-submodules && git submodule update)
        सामग्री gitsuper/ और gitsuper/gitsub/ में पुल से अद्यतन किया जाता है।
      2. hg commit -m 'updated gitsuper (and its contents)'
    8. hgsuper2 क्लोन में पुल।
      1. hg pull -u
        Git से सामग्री अद्यतन किया गया है।

    मेरे परीक्षण में काम किया (मर्क्युरियल 1.8.1 और Git 1.7.4.1 का उपयोग), लेकिन मैं एक बग देखा। Mercurial एक अलग नामित गिट शाखा (origin/master (यानी refs/heads/origin/master) अलग-अलग सिर (जैसे गिट इसके सबोड्यूल के साथ करता है) या बस master (यानी refs/heads/master) का उपयोग करने के बजाय एक अजीब नामित गिट शाखा (refs/heads/origin/master) बनाता है और जांचता है।

    fatal: git checkout: branch origin/master already exists 
    abort: git checkout error 128 in gitsuper 
    

    मैं सवाल (Git आधारित मर्क्युरियल subrepository) में Git भंडार में जाकर समस्या को हल काम किया है और साथ शाखा को हटाने: यह भी इस तरह त्रुटियों में जिसके परिणामस्वरूप, थोड़ा समय पर अंकित करने के लिए लगता है git checkout HEAD~0 && git branch -D origin/master (पहला सिर को अलग करता है और (अधिक महत्वपूर्ण रूप से) शाखा से बाहर निकलता है ताकि इसे अगले आदेश द्वारा हटाया जा सके)। यह कामकाज पूरी तरह से सुरक्षित है जब तक कि आपके पास गिट भंडार में कोई स्थानीय परिवर्तन नहीं होता है।

    एक और छोटी समस्या यह है कि आपको git submodule init चलाने की आवश्यकता होगी ताकि गिट सबमिशन कमांड जारी करने से पहले गिट सबमिशन कमांड जारी करने से पहले गिट को अपने सबोडोड्यूल के बारे में पता चल सके, जो कि मर्कुरियल द्वारा बनाया गया था (सबमिड्यूल सही स्थानों पर क्लोन किए गए थे, लेकिन वे थे Mercurial द्वारा स्थापित, इसलिए .git/config में उनके लिए कोई प्रविष्टियां नहीं हैं)।

    इसी प्रकार, यदि आप गिट द्वारा प्रबंधित गिट-आधारित Mercurial subrepository के अंदर से सामग्री में परिवर्तनों को संलेखित करने की योजना बनाते हैं, तो आपको हमेशा गिट subrepositories से किसी भी गिट submodules, प्रतिबद्ध, और धक्का जोड़ने के लिए सावधान रहना चाहिए Mercurial "superproject" में काम करना। अन्यथा, आप एक स्थिति के साथ अंत हो सकता है जहां मर्क्युरियल gitsuper और gitsub में से एक संयोजन का उपयोग करता जबकि gitsuper ही gitsub के किसी भिन्न संस्करण को दर्शाता है। दूसरे शब्दों में, चूंकि आप गिट के सबमिशन कोड को छोड़कर (गिट सबमिड्यूल को मर्कुरियल सब्रेपिटिटरीज के रूप में प्रबंधित करके) को छोड़ देंगे, तो आपको मर्कुरियल के साथ सिंक्रनाइज़ किए गए सबोडोड्यूल के गिट के दृश्य को रखने के लिए सावधान रहना होगा।

  • +0

    कमाल का जवाब। बक्षीस तुम्हारा है। सभी प्रयासों के लिए धन्यवाद। मैं कामकाज का परीक्षण करने जा रहा हूं, और शायद इस व्यवहार को पकड़ने के बारे में मर्कुरियल कोड और मेलिंग सूचियों में थोड़ी सी खोज करूँगा। –

    +0

    आपका जवाब वास्तव में उस समय अद्भुत था, लेकिन मैंने बस यह सब पागलपन छोड़ दिया। :) –

    0

    गिट वास्तव में उपप्रोजेक्ट्स की तरह "पसंद" नहीं करता है। मैंने थोड़ा सा देखा, और ऐसा लगता है कि http://git.rsbx.net/Notes/Git_Subprojects.txt में वह जानकारी हो सकती है जिसे आप ढूंढ रहे हैं?

    +0

    उस दस्तावेज़ में काफी पुराना है। यह बहुत संभावना है कि गिट 1.5.3 (सितंबर 2007) में गिट ने सबमिशन समर्थन हासिल करने से पहले लिखा था। "डैश किए गए कमांड" का उपयोग करता है ('गिट क्लोन' के बजाए 'गिट क्लोन') गिट 1.5.4 (फरवरी 2008) में बहिष्कृत किया गया था और गिट 1.6 (अगस्त 2008) में सामान्य पाथ से बाहर निकाला गया था। मुझे यकीन नहीं है कि दस्तावेज़ को पूछताछ में मदद करने के लिए कैसे माना जाता है। क्या यह सबप्रोजेक्ट्स को मैन्युअल रूप से प्रबंधित करने के बारे में कुछ विचार प्रदान करना चाहिए? ऐसा लगता है कि यह ज्यादातर एक मर्कुरियल सवाल है (इसे गिट-आधारित सब्रेपिटिटरीज में स्वचालित रूप से '.gitmodules' फ़ाइलों का उपयोग करने के लिए कैसे प्राप्त करें)। –

    +0

    @ क्रिस जॉनसन: निश्चित रूप से। Mercurial subitpositories के रूप में गिट repos हो सकता है, लेकिन जब इन git repositories एचजी subrepositories के रूप में काम कर रहे हैं, तो खुद को एक git subrepo (एक .gitmodules फ़ाइल में) में इस repo में .gitmodules क्लोन नहीं है। मुझे गिट सबरेपो को मैन्युअल रूप से क्लोन करना होगा। –

    1

    भविष्य के लिए गुप्त।

    1. एक्सटेंशन इंस्टॉल उपयुक्त/pacman/पिप के माध्यम से/... और अपनी परियोजना निर्देशिका करने के लिए या सिर्फ अपने ~/.hgrc
    2. नेविगेट में इसे सक्रिय: आप वास्तव में Git submodules के स्वत: पुनर्प्राप्ति पाने के लिए मर्क्युरियल के लिए Hg-Git plugin उपयोग कर सकते हैं .hgsub में hg clone https://github.com/user/libawesome.git && (cd libawesome && hg up release)
    3. यह सहेजें किसी अन्य एचजी subrepository और सह के रूप में: hg init test && cd test
    4. क्लोन अपना Git निर्भरता के माध्यम से कुछ डमी भंडार प्रतिबद्ध आप चाहते हैं और यह नाखून (जो भी यह है खुद submodules है) MMIT परिवर्तन: echo "libawesome = https://github.com/user/libawesome.git" >> .hgsub && hg add .hgsub && hg ci -m "git subrepository added;"
    5. अब आप सत्यापित कर सकते हैं कि Git निर्भरता संक्रामक क्लोन कर रहे हैं: (cd .. && hg clone test test2)
    संबंधित मुद्दे