2009-10-27 16 views
15

मेरे पास कई अर्ध-संबंधित परियोजनाएं हैं जिन्हें मैं संस्करण नियंत्रण करना चाहता हूं। SVN में मैं किसी एक प्रोजेक्टएकाधिक शाखाओं के लिए Mercurial भंडार लेआउट

/scripts #updates in sync with project1 & project2 
/project1 #requires database 
/project2 #requires database 
/database 

स्वाभाविक रूप से अन्य SVN लेआउट इस खिलौने उदाहरण के लिए संभव हो रहे हैं के भीतर उन्हें के रूप में एकाधिक निर्देशिका स्थापित करेगा ऊपर है, लेकिन इस लेआउट लाभ हैं:

  • मैं कॉपी कर सकते हैं शाखाओं के बीच फ़ाइलें इतिहास को संरक्षित करते हुए
  • मैं केवल परियोजनाओं का एक सबसेट देख सकता हूं, उदाहरण के लिए svn co repo/project2; svn co repo/database। यह प्रोजेक्ट 1 बड़ा होने पर भंडारण & समय की एक बड़ी मात्रा बचाता है।
  • आसान भंडार प्रबंधन, के बाद से उपयोगकर्ता पहुँच सभी परियोजनाओं

के लिए एक बार परिभाषित किया गया है इस प्रतिमान में अच्छी तरह से नक्शा नहीं है you can't clone a single directory of a mercurial repo के बाद से तेज करने के लिए। तो मेरा सवाल है: मर्कुरियल में बड़ी, बारीकी से संबंधित परियोजनाओं को स्टोर करने का सबसे आम तरीका क्या है?

मेरे विचार:

  • एकाधिक खजाने - फ़ाइलें जो परियोजनाओं
  • Forests के बीच ले जाने के इतिहास खो देता है - रुक लगता है, और मुझे यकीन है कि कैसे स्थिर इस विस्तार ज्यादातर के साथ
  • नाम शाखाओं है नहीं कर रहा हूँ असंबद्ध सामग्री
  • SubRepos - दुर्भाग्य से मैं उबंटू 9.04 चला रहा हूं, जो केवल 1.1.2 जहाजों को चलाता है। अन्यथा यह एक अच्छा विकल्प

उत्तर

10

एकाधिक भंडार, वन और सबरेपोस एक ही विचार पर सभी प्रकार के रूप में दिखेंगे। वन और सबरेपोस सिर्फ प्रबंधन परियोजनाएं बनाते हैं जो अन्य परियोजनाओं के बेहद हाल के संस्करणों का भी उपयोग करते हैं, वे आपके पास मूलभूत समस्या का समाधान नहीं करते हैं, जो कि आप परियोजनाओं के बीच उन्हें स्थानांतरित करते समय फ़ाइल इतिहास खो देते हैं।

मेरी राय में, आपकी सबसे अच्छी शर्त सभी निर्देशिकाओं को एक ही भंडार में रखना है और Mercurial सुविधा के लिए उपनिर्देशिका के चेकआउट की अनुमति देना है। उपनिर्देशिका सुविधा एक Mercurial टीम के बारे में परवाह है, लेकिन यह करने के लिए तुच्छ नहीं है, यही कारण है कि यह अभी तक नहीं किया गया है। मैं हालांकि Mercurial आंतरिक पता है, और यह निश्चित रूप से काम करने योग्य है, बस बहुत काम है।

दूसरा सबसे अच्छा विकल्प, हालांकि मैं इसे वास्तव में बदसूरत मानता हूं, नामित शाखा विचारों का उल्लेख आपने किया है। जब भी आप शाखाओं के बीच फ़ाइलों की प्रतिलिपि बनाना चाहते हैं, तब भी आपको प्रदर्शन करने के लिए एक बहुत अजीब विलय ऑपरेशन होगा।

  1. शाखा आप में फ़ाइल की प्रतिलिपि बनाना चाहते के मुखिया के अपडेट:: आप इन चरणों प्रदर्शन करेंगे सिर के HGMERGE=/bin/false hg merge -r project2
  2. रिवर्ट: शाखा में hg update -C project1
  3. मर्ज से फ़ाइल की प्रतिलिपि बनाना चाहते शाखा के आप में फाइल कॉपी करना चाहते हैं: hg revert -a --no-backup -r project1
  4. आप के सिर संशोधन से कॉपी करना चाहते हैं विशिष्ट फ़ाइल वापस लाएं शाखा में विलय कर दिया: hg revert --no-backup -r project2 path/to/file/in/project2.txt
  5. ले जाएँ फ़ाइल में शाखा की प्रतिलिपि बनाना चाहते में जगह नहीं है यह करने के लिए: hg mv path/to/file/in/project2.txt project1/file/path/project2.txt
  6. मार्क मर्ज के रूप में हल हो: hg resolve -am
  7. और अंत में परिणाम के लिए प्रतिबद्ध: hg commit -m "A merge to copy project2.txt to project1."

जैसा कि मैंने कहा, बहुत बदसूरत। और यह अच्छी तरह से एचजी 1.3 में अच्छी तरह से काम कर सकता है क्योंकि मुझे पता है कि रिवर्ट, मर्ज और हल करने की बातचीत में कुछ महत्वपूर्ण बग हाल ही में तय किए गए थे। (IMHO, मुझे लगता है उबंटू गैर BzR संस्करण नियंत्रण प्रणाली के संस्करणों पर जानबूझ कर पीछे है।)

कितनी बार आप वास्तव में परियोजनाओं के बीच फ़ाइलों को कॉपी होने की उम्मीद करते हैं? ऐसा क्यों होगा? क्या आप सुनिश्चित हैं कि इतिहास खोना किसी चीज का बुरा होगा?

मैंने अपनी कुछ परियोजनाओं के लिए सबवर्जन में कुछ ऐसा ही किया है, लेकिन मेरा अनुभव यह है कि मेरी प्रारंभिक भावना जिसके बारे में वास्तव में कुछ प्रोजेक्ट था, वास्तव में सही था, और जब यह इतिहास को संरक्षित नहीं कर रहा था ' वास्तव में इतिहास के बाद से यह एक बड़ा सौदा मूल परियोजना के लिए वास्तव में प्रासंगिक था, फाइल वैसे भी थी।

+0

वाह, नामित शाखा चरणों के लिए धन्यवाद। इस तरह विचार करने के लिए बहुत बदसूरत है। मैं सिर्फ इतिहास खोने के साथ सौदा करूँगा-वैसे भी यह एक दुर्लभ मामला था। दरअसल, परियोजनाओं के बीच परिवर्तन विलय करने की तुलना में एक बड़ी समस्या निर्भरताओं को सिंक्रनाइज़ करना है। अर्थात। प्रोजेक्ट 1 @ आर 50 डाटाबेस @ आर 50 की जरूरत है। यह svn के साथ किया जा सकता है, हालांकि इसे ऊपर दिए गए की तुलना में थोड़ा अधिक जटिल चेकआउट की आवश्यकता है। – Quantum7

+0

निर्भरता सिंक्रनाइज़ करना ठीक है सबबैप्स और वन क्या हैं। – Omnifarious

+1

आगे विस्तार करने के लिए, मैं SubRepos और Forests को svn का कार्यान्वयन करने के लिए मानता हूं: Mercurial के लिए बाहरी, और Mercurial मानसिकता के साथ कि मेटा-डेटा को स्पष्ट रूप से उनसे जुड़ा हुआ फाइलों में स्पष्ट रूप से संग्रहीत किया जाना चाहिए और विशेष उद्देश्य VCS आदेशों के साथ प्रबंधित किया जाना चाहिए। – Omnifarious

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