svn: ट्रंक को शाखा के साथ बदलें


155

एक तोड़फोड़ भंडार की एक शाखा को नई ट्रंक बनाने का सबसे अच्छा तरीका क्या है?

संपूर्ण प्रणाली के लिए एक प्रमुख पुन: लिखा गया है: चीजों को चारों ओर ले जाया गया है, फिर से लिखा गया है, प्रतिस्थापित किया गया है, हटा दिया गया है, नाम बदल दिया गया है) पुन: लिखित कोड का परीक्षण किया गया है और पुराने ट्रंक को बदलने के लिए तैयार है।

मूल रूप से, पुरानी मेनलाइन (ट्रंक 5) को टैग किया गया है और यहां समाप्त होगा। फिर से लिखा शाखा (शाखा 6) नई मेनलाइन (ट्रंक 7) बनना है:

ट्रंक (1) -> ट्रंक (2) -> ट्रंक (५) -> × + -> नया ट्रंक (()
  \ _ |
  कांटा मर्ज ???
    \ _ |
     + -> शाखा (3) -> शाखा (4) -> शाखा (6) - +

पुराने 'ट्रंक' से चल रहे सभी परिवर्तन पहले से ही 'लिखित शाखा' में शामिल हैं

मैं यह कैसे कर सकता हूँ?

जवाबों:


118

पुरानी ट्रंक की सामग्री को कहीं और स्थानांतरित करने के लिए svn चाल का उपयोग करें और बाद में ट्रंक करने के लिए शाखा का नाम बदलें।

ध्यान दें कि svn में कॉपी और स्थानांतरित फ़ाइल संचालन की तरह काम करते हैं। आप अपने रिपॉजिटरी में सामान को इधर-उधर ले जाने / कॉपी करने के लिए इनका उपयोग कर सकते हैं और इन परिवर्तनों को भी लागू किया जाता है। "चाल" को "प्रतिलिपि + हटाएं" के रूप में सोचें।

[संपादित करें] निलबस ने मुझे सूचित किया कि जब आप उपयोग करेंगे तो आपको मर्ज संघर्ष होगा svn move

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


1
यदि आप ऐसा करते हैं, तो मूल ट्रंक में एक कार्यशील प्रति में परिवर्तन वाले किसी व्यक्ति के पास एक संघर्ष होगा, भले ही उनके परिवर्तनों का विलय हो। ऐसा इसलिए है क्योंकि फ़ाइलों को हटा दिया जाता है और फिर से जोड़ा जाता है - उन्हें अलग-अलग इतिहास के साथ अलग-अलग वस्तुओं के रूप में माना जाता है।
एडवर्ड एंडरसन

@nilbus: क्या आपने इसे आज़माया? IIRC, SVN दिखाता है कि फ़ाइलें हटा दी गईं और पढ़ी गईं लेकिन आंतरिक रूप से, यह पता चलेगा कि फ़ाइलों को स्थानांतरित कर दिया गया है।
एरोन दिगुल्ला

हाँ। मैंने दो प्रतियों की जाँच की। पहली प्रति में मैंने dir A को A2 में स्थानांतरित किया और B को A. को फिर d को A से B में स्थानांतरित किया, फिर A2 से A. (नाम बदलें और वापस नाम।) 2 के चेकआउट में, मैंने एक फ़ाइल में परिवर्तन किया और svn के लिए प्रयास किया। अपडेट करें। यह विरोधाभास था क्योंकि मैंने जो फ़ाइल बदली वह "हटा दी गई" थी। आंतरिक रूप से यह फ़ाइलों की डुप्लिकेट प्रतियों को सहेजता नहीं है, लेकिन आप जो देखते हैं वह डिलीट हो जाता है जब टकराव की बात आती है।
एडवर्ड एंडरसन

12
@nilbus: इस बिंदु पर, मैं लिनुस टॉर्वाल्ड्स को उद्धृत करना चाहूंगा: "थोड़ी देर के लिए तोड़फोड़ का नारा" सीवीएस सही किया गया था ", या ऐसा कुछ, और यदि आप उस तरह के नारे के साथ शुरू करते हैं, तो अब आप कर सकते हैं जाओ। सीवीएस सही करने का कोई तरीका नहीं है। "
आरोन दिगुल्ला

3
हां। मुझे स्वीकार होगा। इस समस्या को हल करने के लिए, मैंने वास्तव में svn-git के साथ रेपो की जाँच की, और मास्टर पर शाखा को फिर से बनाने के लिए git का उपयोग किया।
एडवर्ड एंडरसन

66

मैं इस लक्ष्य को पूरा करने के लिए svn चाल कमांड का उपयोग करने से सहमत हूं।

मैं जानता हूं कि अन्य लोग इसके बारे में सोचते हैं, लेकिन मैं इसे इस तरह से करना पसंद करता हूं। जब मेरे पास एक सुविधा शाखा होती है और मैं इसे एक ट्रंक के साथ विलय करने के लिए तैयार होता हूं जिसे काफी संशोधित किया गया है, तो मैं इसे एक नई शाखा में विलय कर दूंगा, जिसे आमतौर पर नाम दिया गया है <FeatureBranchName>-Merged। फिर मैं संघर्षों को हल करता हूं और मर्ज किए गए कोड का परीक्षण करता हूं। एक बार जब मैं पूरा हो जाता हूं तो मैं ट्रंक को टैग फ़ोल्डर में ले जाता हूं ताकि मुझे कुछ खोना न पड़े। अंत में मैं अपनी <FeatureBranchName>-Mergedसूंड को आगे बढ़ाता हूं ।

इसके अलावा मैं मूव्स करते समय वर्किंग कॉपी से बचना पसंद करता हूं, यहां कमांड्स के नमूने हैं:

svn move https://SVNUrl/svn/Repo/trunk https://SVNUrl/svn/Repo/tags/AnyName

svn move https://SVNUrl/svn/Repo/branches/BranchName-Merged https://SVNUrl/svn/Repo/trunk

नोट: मैं 1.5 का उपयोग करता हूं


1
यह सबसे अच्छा अभ्यास नहीं हो सकता है लेकिन यह निश्चित रूप से सबसे कुशल है जब आपके पास एक बहुत पुरानी ट्रंक है और हर कोई शाखा पर काम करता है जैसे कि वह ट्रंक था। इसने मेरी समस्या हल कर दी!
एलेक्स पेरिन

12

मैं हाल ही में इस समस्या को देख रहा था, और जिस समाधान से मैं बहुत खुश था वह प्रदर्शन कर रहा था

svn मर्ज --ignore-ancestry ट्रंक-यूआरएल शाखा-यूआरएल

मेरी ट्रंक की वर्किंग कॉपी पर।

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


1
पोस्ट svn 1.5 आप इतिहास को संरक्षित करने वाले मर्ज करने में सक्षम होना चाहिए।
NSherwin

9

अनुशंसा करें कि आप इन परिवर्तनों को रिपॉजिटरी ब्राउज़र टूल के माध्यम से करते हैं।

वर्किंग कॉपी के माध्यम से बड़े डिलीट + मूव ऑपरेशंस का प्रयास करना वर्किंग कॉपी को मारने का एक शानदार तरीका है। यदि आप वर्किंग कॉपी का उपयोग करने के लिए मजबूर हैं, तो प्रत्येक डिलीट या मूव ऑपरेशन के बाद इंक्रीमेंटल कमिट्स करें और प्रत्येक कमेटी के लिए अपनी वर्किंग कॉपी को अपडेट करें।


रेपो के लिए एक कड़ी उपयोगी होगी (बस सुविधा के लिए- एक Google खोज सहेजें :))
ब्रायन एम। हंट

3
माफ़ करना। वर्तनी से ऐसा लगता है जैसे मैं किसी विशिष्ट उपकरण (संपादित) का जिक्र कर रहा था। दरअसल, ज्यादातर SVN GUI टूल्स में रिपॉजिटरी ब्राउजर फीचर होना चाहिए। FYI करें: मैं कछुआ tortoisesvn.tigris.org का
क्रिस नावा

4

यदि आप शाखा को नया ट्रंक (यानी) बनाना चाहते हैं, तो ट्रंक में सभी परिवर्तनों से छुटकारा पाएं जो शाखा बनने के बाद से थे, आप 1. ट्रंक की एक शाखा बना सकते हैं (बैकअप प्रयोजनों के लिए) 2. "परिवर्तन वापस करें "ट्रंक पर (ब्रांच बनने के बाद सभी संशोधनों का चयन करें। 3. ट्रंक को वापस मर्ज करें।

इतिहास को इस तरह बचाना चाहिए।

सादर, रोजर


3

@ एरोन डिगुल्ला और @kementeus समाधान व्यावहारिक हैं। सबवर्सन 1.4 रिपॉजिटरी के लिए, कॉपी / मूव ऑपरेशंस भविष्य के माइग्रेशन को एक अलग रिपॉजिटरी स्ट्रक्चर या स्प्लिट रिपॉजिटरी में विभाजित करना मुश्किल बना सकते हैं।

मेरा मानना ​​है कि 1.5 के सुधार में चाल / कॉपी इतिहास का बेहतर रिज़ॉल्यूशन शामिल है, इसलिए यह संभवतः 1.5 रिपॉजिटरी के लिए एक मुद्दा नहीं होगा।

1.4 रिपॉजिटरी के लिए, मैं किसी अन्य तंत्र के साथ ट्रंक की शाखा को स्थानांतरित करने के लिए उपयोग करने svnadmin dumpऔर svndumpfilterमौजूदा ट्रंक के आंदोलन को करने की सलाह दूंगा। दो डंपफाइल्स को एक परीक्षण भंडार में लोड करें, सत्यापित करें, फिर इसे उत्पादन में ले जाएं।

बेशक, शुरू करने से पहले अपने मौजूदा भंडार का बैकअप लें।

यह स्पष्ट रूप से चाल / कॉपी को रिकॉर्ड किए बिना इतिहास को संरक्षित करता है और भविष्य के पुन: संगठन को बनाता है, इतिहास को संरक्षित करना, आसान।


संपादित करें: जैसा कि अनुरोध किया गया है, 1.4 रेड-बीन किताब, फ़िल्टरिंग रिपॉजिटरी हिस्ट्री से 1.4 व्यवहार का प्रलेखन

साथ ही, कॉपी किए गए रास्ते आपको कुछ परेशानी दे सकते हैं। तोड़फोड़ रिपॉजिटरी में कॉपी ऑपरेशंस का समर्थन करता है, जहां पहले से मौजूद कुछ रास्ते को कॉपी करके एक नया रास्ता बनाया जाता है। यह संभव है कि आपके रिपॉजिटरी के जीवनकाल में कुछ बिंदु पर, आपने कुछ स्थान से एक फ़ाइल या निर्देशिका की प्रतिलिपि बनाई हो, जो उस स्थान svndumpfilterको छोड़कर, जिसमें वह शामिल है। डंप डेटा को आत्मनिर्भर बनाने के लिए,svndumpfilterअभी भी नए पथ के अलावा को दिखाने की जरूरत है - कॉपी द्वारा बनाई गई किसी भी फाइल की सामग्री सहित - और उस स्रोत से एक कॉपी के रूप में उस जोड़ का प्रतिनिधित्व न करें जो आपके फ़िल्टर्ड डंप डेटा स्ट्रीम में मौजूद नहीं होगा। लेकिन क्योंकि सबवर्सन रिपॉजिटरी डंप प्रारूप केवल यह बताता है कि प्रत्येक संशोधन में क्या बदला गया था, कॉपी स्रोत की सामग्री शायद ही उपलब्ध न हो। यदि आपको संदेह है कि आपकी रिपॉजिटरी में आपके पास इस तरह की कोई भी कॉपियाँ हैं, तो आप अपने सम्मिलित / बहिष्कृत रास्तों के अपने सेट पर पुनर्विचार करना चाह सकते हैं, शायद उन रास्तों को भी शामिल करें जो आपके परेशानी वाले कॉपी ऑपरेशंस के स्रोतों के रूप में कार्य करते हैं।

यह उपयोग करने के लिए माइग्रेशन / पुनर्गठन पर लागू होता है svndumpfilter। ऐसे समय होते हैं जब थोड़ा अतिरिक्त काम अब बाद में बहुत सारे अतिरिक्त काम बचा सकता है, और svndumpfilterभविष्य के प्रवास / पुनर्गठन के लिए उपलब्ध का एक आसान उपयोग करके जोखिम को अपेक्षाकृत कम लागत पर कम करता है।


"Svn चाल" पर्याप्त क्यों नहीं होगी? आपका सुझाव एक स्लेजहेमर के साथ एक मक्खी को स्क्वीज़ करने जैसा लगता है।
रॉब विलियम्स

मुझे इस 1.4 व्यवहार से काट दिया गया है - यदि किसी SVN रिपॉजिटरी में डायरेक्टरी या ब्रांच / टैग्स के मूव्स (नाम) होते हैं, तो पुनर्गठन के लिए svndumpfilter का उपयोग किसी नए स्ट्रक्चर में रिपॉजिटरी को माइग्रेट / माइग्रेट करने में मदद कर सकता है क्योंकि यह इतिहास को हैंडल नहीं करता है। कुंआ। यह प्रलेखित है, मैं रेफ को खोदूंगा। अगर आपको पसंद है
केन जेंटल

क्या आप इस व्यवहार का संदर्भ जोड़ सकते हैं?
जैको डे

2

जबकि ऊपर दिए गए जवाब काम करेंगे, वे सर्वोत्तम अभ्यास नहीं हैं। नवीनतम svn सर्वर और क्लाइंट ट्रैक आपके लिए विलीन हो जाता है। तो svn जानता है कि कौन से संशोधन आप एक शाखा में और कहाँ से विलीन हो गए हैं। यह एक शाखा को अप-टू-डेट रखने और फिर इसे ट्रंक में वापस विलय करने में बहुत मदद करता है।

कोई फर्क नहीं पड़ता कि आप किस संस्करण का उपयोग कर रहे हैं, लेकिन फिर भी ट्रंक में एक शाखा में परिवर्तन प्राप्त करने के लिए एक सर्वोत्तम अभ्यास विधि है। इसे तोड़फोड़ नियमावली में उल्लिखित किया गया है: संस्करण नियंत्रण में तोड़फोड़, अध्याय 4। शाखा में एक शाखा रखते हुए शाखा और विलय


आधिकारिक जानकारी के लिए Thx ताकि मैं आधिकारिक दृष्टिकोण से शाखा को ट्रंक में विलय कर सकूं। कीवर्ड है के एकीकरण
Junyo

-3

यह SVN में एक बहुत ही अजीब / असामान्य विन्यास है, यहां तक ​​कि मुझे लगता है कि यह "अच्छा अभ्यास" होने से बहुत दूर है, वैसे भी, मुझे लगता है कि आप कुछ ऐसा कर सकते हैं:

  • चेकआउट सभी सॉर्सेट्री (svn co therootsourcetree)
  • ट्रंक निकालें (svn rm trunk)
  • शाखा को ट्रंक (svn cp शाखाओं / -ब्रांच / ट्रंक) में कॉपी करें
  • शाखा निकालें (svn rm शाखाओं / thebranch)
  • परिवर्तन करें

सौभाग्य


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