ट्रंक से SVN टैग को ठीक से कैसे बनाएं?


282

मैं सबवर्सन में अपना पहला प्रोजेक्ट बना रहा हूं । अब तक मेरे पास है

 branches
 tags
 trunk

मुझे लगता है कि मुझे तुरंत शाखाओं को एकवचन बनाने और शुरू करने की आवश्यकता है। अद्यतन शाखाएँ आदर्श हैं।

मैं ट्रंक में काम कर रहा है और सामग्री को टैग के रूप में निम्नानुसार स्थानांतरित कर रहा हूं।

mkdir tags/1.0
cp -rf trunk/* tags/1.0
svn add tags/1.0
svn commit -m " create a first tagged version"

मेरा पेट मुझे बताता है कि यह पूरी तरह से गलत है, और मुझे फ़ाइलों के उपयोग के बीच कुछ संबंध बनाए रखना चाहिए svn copy। इस तरह से बनाई गई फ़ाइलों का एक दूसरे से कोई संबंध नहीं होगा, और मुझे यकीन है कि मैं तोड़फोड़ की विशेषताओं को याद करूंगा। क्या मैं सही हूँ?

क्या मुझे व्यक्तिगत फ़ाइलों के लिए svn कॉपी का उपयोग करना चाहिए?

mkdir tags/1.0
svn add tags/1.0
svn copy trunk/file1 tags/1.0
svn copy trunk/file2 tags/1.0
svn copy trunk/file3 tags/1.0
svn commit -m " create a first tagged version"

क्या मुझे पूरी निर्देशिका पर svn कॉपी का उपयोग करना चाहिए?

svn copy cp -rf trunk tags/1.0
svn commit -m " create a first tagged version"

10
दुर्भाग्य से मैं इस मामले में सभी विकल्प नहीं बनाता ... git बहुत लानत जादू है।
ojblass

जवाबों:


186

आप इसमें सही हैं कि टैग फ़ोल्डर में फ़ाइलों को जोड़ना "सही" नहीं है।

आपने सही अनुमान लगाया है कि copyउपयोग करने के लिए ऑपरेशन है; यह तोड़फोड़ को इन फाइलों के इतिहास पर नज़र रखने देता है, और यह भी (मुझे लगता है) उन्हें अधिक कुशलता से संग्रहीत करता है।

मेरे अनुभव में, पूरे प्रोजेक्ट्स की कॉपियाँ ("स्नैपशॉट"), यानी रूट चेक-आउट लोकेशन की सभी फाइलें करना सबसे अच्छा है। इस तरह से स्नैपशॉट अपने दम पर खड़ा हो सकता है, समय के साथ किसी विशेष बिंदु पर संपूर्ण परियोजना की स्थिति का सही प्रतिनिधित्व करता है।

"पुस्तक" का यह हिस्सा दिखाता है कि कमांड का आमतौर पर कैसे उपयोग किया जाता है।


15
पुस्तक का 1.1 संस्करण बहुत पुराना है। यहाँ एक बेहतर लिंक है: svnbook.red-bean.com/nightly/en/svn.branchmerge.tags.html
Quinn Taylor

1
कॉपी की गई फाइलें कोई अतिरिक्त स्थान खर्च नहीं करती हैं
कार्लोस

424

उपयोग:

svn copy http://svn.example.com/project/trunk \
      http://svn.example.com/project/tags/1.0 -m "Release 1.0"

आशुलिपि:

cd /path/to/project
svn copy ^/trunk ^/tags/1.0 -m "Release 1.0"

36
मैंने इसे उत्तर के रूप में चिह्नित किया। बस एक अतिरिक्त नोट। आप ट्रंक का एक पिछला संशोधन प्राप्त कर सकते हैं और इसे "टैग" भी कर सकते हैं। कमांड: svn copy -r 123 " svn.example.com/project/trunk " " svn.example.com/project/tags/1.0 " -m "टैगिंग, लेकिन पुराने संशोधन (123) का उपयोग करते हुए।"
ग्रेनडाकोडर

7
मुझे svn मिलता है : स्थानीय, गैर-प्रतिबद्ध संचालन लॉग संदेश या संशोधन गुण नहीं लेते हैं , इसलिए मैं सिर्फ -m विकल्प को हटाता हूं।
जॉनी

4
बस एक FYI करें, सुनिश्चित करें कि आपका url http या https सहित आपके भंडार से मेल खाता है।
नॉर्मन एच।

2
पहली पंक्ति के अंत में \ _ क्यों?
फ्रैक्टालिस्टे

1
@ जॉनी मैं "-m" विकल्प के बिना उपरोक्त कमांड को चलाने में असमर्थ हूं। मैं टर्मिनल का उपयोग कर रहा हूँ MAC।
अब्दुर्रहमान मुबीन अली

14

जैसा कि @victor ह्यूगो ने उल्लेख किया है, "उचित" तरीका svn कॉपी का उपयोग करना है। हालांकि एक कैवेट है। उस तरह से बनाया गया "टैग" एक सच्चा टैग नहीं होगा, यह निर्दिष्ट संशोधन की एक सटीक प्रतिलिपि होगी, लेकिन यह अपने आप में एक अलग संशोधन होगा। इसलिए यदि आपका बिल्ड सिस्टम किसी तरह से svn revision का उपयोग करता है (जैसे आपके द्वारा निर्मित उत्पाद के संस्करण में 'svn जानकारी' के साथ प्राप्त संख्या को सम्मिलित करता है), तो आप टैग से बिल्कुल उसी उत्पाद का निर्माण नहीं कर पाएंगे परिणाम में मूल कोड के बजाय टैग का संशोधन होगा)।

ऐसा लगता है कि वास्तव में उचित मेटा टैग बनाने के लिए svn में कोई रास्ता नहीं है।


4
"लास्ट echo "{ 'svnRev': \"`svn info | awk '/Last Changed Rev:/{print $4}'`\" }" >svnver.txt
चेंजेड

इस तरह, अलग-अलग संशोधन संख्या वाली (निश्चित रूप से) दो शाखाएं अभी भी एक ही सॉफ्टवेयर संस्करण का उत्पादन करती हैं।
18446744073709551615

1
हां, आप लास्ट चेंजेड रेव के बारे में सही हैं, लेकिन यह इस तथ्य को नहीं बदलता है कि डिज़ाइन द्वारा सबवर्सन में कोई वास्तविक टैग नहीं हैं।
अलेक्जेंडर एमेलकिन

@ 18446744073709551615: आप विकल्प awkका उपयोग करके सीधे svn से उस जानकारी का उपयोग करने और प्राप्त करने से बच सकते हैं --show-item:svn info --show-item last-changed-revision
Luchostein

12

बस इस का उपयोग करें:

svn  copy  http://svn.example.com/project/trunk  
           http://svn.example.com/project/branches/release-1
           -m  "branch for release 1.0"

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

मेरे ब्लॉग पर SVN उपयोग का बेहतर सारांश देखें: SVN Essentials , और SVN Essentials 2


क्या आप विस्तृत कर सकते हैं कि यह कैसा दिखना चाहिए अगर मैं केवल ट्रंक से चेकअप करता हूं और मैं अपनी स्क्रिप्ट के साथ अंदर हूं।
१०:४४ पर ०५

यदि आपने ट्रंक फ़ोल्डर की जांच की है, तो आपको रिपॉजिटरी के http पते का उपयोग करने की आवश्यकता है। मैंने इसका प्रतिनिधित्व करने के लिए उत्तर को अपडेट कर दिया है क्योंकि ट्रंक फ़ोल्डर की जाँच करना अनुशंसित पैटर्न है।
एजिलेप्रो

यह उत्तर स्वीकृत से अलग कैसे है?
डैनियल डब्ल्यू।

11

कछुआ का उपयोग कर सकते हैं:

http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-branchtag.html


1
मैं इसके ऊपर एक बड़ी प्रणाली बनाने जा रहा हूं, इसलिए मुझे प्रदान किए गए मुख्य कार्यों पर ध्यान केंद्रित करने की आवश्यकता है।
ojblass

2
धन्यवाद! कमांड लाइन सही हो सकती है, लेकिन यह अधिक उपयोगी है।
Ray301

7

@victor ह्यूगो और @ वनविंड सही हैं, और विजेता का समाधान अब तक सबसे सरल है। हालाँकि आपके एसवीएन प्रोजेक्ट में एक्सटर्नल के बीवेयर। यदि आप बाहरी पुस्तकालयों का संदर्भ देते हैं, तो बाहरी पुनरीक्षण संदर्भ (चाहे एक टैग, या HEAD, या संख्या) अपरिवर्तित रहेंगे, जब आप बाहरी संदर्भों को टैग करते हैं।

टैगिंग के इस पहलू को संभालने के लिए एक स्क्रिप्ट बनाना संभव है, उस विषय पर चर्चा के लिए, यह एसओ लेख देखें: एक्सवर्टन के साथ एसवीएन चेकआउट टैग करना


5

सबवर्सन रिपॉजिटरी को टैग करने का एक अन्य विकल्प यह है कि टैग को svn में जोड़ें: संपत्ति को इस तरह लॉग करें:

   echo "TAG: your_tag_text" > newlog
   svn propget $REPO --revprop -r $tagged_revision >> newlog
   svn propset $REPO --revprop -r $tagged_revision -F newlog
   rm newlog

मैंने हाल ही में सोचना शुरू किया कि यह टैग करने का सबसे "सही" तरीका है। इस तरह आप अतिरिक्त संशोधन नहीं बनाते हैं (जैसा कि आप "svn cp" के साथ करते हैं) और फिर भी "svn log" आउटपुट पर grep का उपयोग करके आसानी से सभी टैग निकाल सकते हैं:

   svn log | awk '/----/ {
                      expect_rev=1;
                      expect_tag=0;
                  }
                  /^r[[:digit:]]+/ {
                      if(expect_rev) {
                          rev=$1;
                          expect_tag=1;
                          expect_rev=0;
                      }
                  }
                  /^TAG:/ {
                      if(expect_tag) {
                          print "Revision "rev", Tag: "$2;
                      }
                      expect_tag=0;
                  }'

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


0
svn copy http://URL/svn/trukSource http://URL/svn/tagDestination -m "Test tag code" 
  $error[0].Exception | Select-object Data

आपको बस URL पथ को बदलना होगा। यह कमांड नई dir "tagDestination" बनाएगी। दूसरी पंक्ति आपको पूर्ण त्रुटि विवरण बताएगी यदि कोई हो। यदि नहीं बनाया है, तो svn env वैरिएबल बनाएं । जाँच कर सकते हैं (Cmd: - set, Powershell: - Get-ChildItem Env :) डिफ़ॉल्ट पथ "C: \ Program Files \ TortoiseSVN \ bin \ TortoiseProc.exe" है


-4

इसे इस्तेमाल करे। इससे मेरा काम बनता है:

mkdir <repos>/tags/Release1.0
svn commit <repos>/tags/Release1.0 
svn copy <repos>/trunk/* <repos>/tag/Release1.0
svn commit <repos/tags/Release1.0 -m "Tagging Release1.0"

1
यह निश्चित रूप से एक गलत तरीका है। टैग (रिलीज़ 1.0) स्रोत निर्देशिका (ट्रंक) की एक प्रति होनी चाहिए, न कि मनमाने ढंग से बनाई गई निर्देशिका। यदि आप इसे अपने तरीके से करते हैं, तो आप स्रोत निर्देशिका का इतिहास खुद ही खो देते हैं और केवल वंशज नोड्स (फ़ाइलों और निर्देशिकाओं) का इतिहास रखते हैं।
अलेक्जेंडर अमेलकिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.