2008-11-12 18 views
6

में स्वचालित रूप से एक टैग बनाना मैं अपनी कंपनी में बिल्ड सिस्टम को बनाए रखता हूं, जो वर्तमान में सीवीएस का उपयोग कर रहा है। यह बिल्ड सिस्टम कई परियोजनाओं और एकाधिक सीवीएस भंडारों में उपयोग किया जाता है।सबवर्सन

जब भी हमारे पास एक मील का पत्थर रिलीज होता है, तो हम एक टैग बनाते हैं। सीवीएस में, यह आसान है:

$ cvs tag TAG_NAME 

यही काम करता है सीवीएस मॉड्यूल या भंडार की परवाह किए बिना आदेश, जब तक कि यह एक सीवीएस कार्यशील निर्देशिका में मार डाला गया है।

हालांकि सबवर्सन में एक ही चीज़ करने के लिए, ऐसा लगता है कि मुझे रिपोजिटरी रूट प्राप्त करने के लिए पहले svn info के आउटपुट को पार्स करना होगा।

svn cp . $REPO_ROOT/tags/TAG_NAME -m"Created tag TAG_NAME" 
निश्चित रूप से

इसमें यह माना जाता SVN भंडार की सिफारिश की "ट्रंक, टैग, शाखाओं" निर्देशिका संरचना है कि: तो मैं साथ टैग बना सकते हैं। तो सुरक्षित होने के लिए मुझे शायद इसे पहले सत्यापित करने की आवश्यकता होगी।

यह एक प्रतीकात्मक नाम के लिए एक संशोधन संख्या को मानचित्रित करने के लिए बहुत सारे काम की तरह लगता है। क्या कोई बेहतर तरीका है?

+0

यदि आप अपने svn cp में - parents जोड़ते हैं तो टैग निर्देशिका तब मौजूद होती है जब यह अस्तित्व में नहीं होती है। –

+0

हम्म, 1.4 क्लाइंट के साथ यहां काम नहीं कर रहा है। आप svn का किस संस्करण का उपयोग कर रहे हैं? –

उत्तर

5

यहाँ कैसे मैं इस लागू किया, इस मामले में किसी को भी उत्सुक है संशोधन, सभी व्यावहारिक उद्देश्यों के लिए, टैग के बराबर है। दुर्भाग्य से, यह वास्तव में प्रासंगिक नहीं है; मेरे उपयोगकर्ता मॉड्यूल नाम और एक (अलग) संस्करण संख्या से बना प्रतीकात्मक नाम चाहते हैं।

2

सीवीएस के विपरीत, टैग सबवर्सन में केवल एक प्रतीकात्मक नाम से अधिक हैं, यही बात है। हम एक टैग बनाते हैं, आप वास्तव में एक शाखा बना रहे हैं। मैं इसे पढ़ने की अनुशंसा करता हूं, यदि आपके पास पहले से नहीं है: http://svnbook.red-bean.com/

5

मैं कमांड लाइन से लगभग विशेष रूप से svn का उपयोग करता हूं और मैं जल्दी से राक्षस URL में टाइप करने से थक गया हूं। अंततः मैंने एक स्क्रिप्ट svnurl लिखा, जिसे मैं खोल से उपयोग करता हूं। यह धारणा पर चल रही है कि एक "परियोजना" फ़ॉर्म ने:

.../PROJECTNAME/trunk 
       tags 
       branches 

मान लेते हैं आप ProjectName/शाखाओं/foo की एक काम के पिछले भाग में कहीं हैं करते हैं:

svnurl -tl # gives a list of tags for the current project 
svnurl -tlu # the same as full urls 
svnurl -t 1.1 # the url for the tag 1.1 of the current project 
# analagous functions for branches 
svnurl -ru # the url of the "root" of the current working copy 
      # eg svn://.../PROJECTNAME/branches/foo 
svnurl -T # the url of the trunk of the current project 
svnurl -pn # the name of the current project, `PROJECTNAME` 
# ... 

प्रयोग इस तरह दिखता है:

$ svn cp $(svnurl -T) $(svnurl -t 1.1.1) # tag trunk as 1.1.1 

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

+0

धन्यवाद, मुझे निश्चित रूप से एक नज़र डालने में दिलचस्पी होगी। मैं इसे सीधे उपयोग करने में सक्षम नहीं हूं, क्योंकि मुझे विंडोज क्लाइंट का समर्थन करना है, लेकिन मुझे यह देखना अच्छा लगेगा कि यह कैसे काम करता है। –

+0

आपको यहां स्क्रिप्ट मिलेगी: [[http://github.com/bpsm/svnurl/tree/master/svnurl.py] gsub at[svnurl]]। – bendin

5

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

अधिकांश svn उपयोगकर्ता टैग्स का इलाज करते हैं जिस तरह से सीवीएस ने उन्हें प्रस्तुत किया। और (अपाचे के तहत, कम से कम) आप किसी भी टैग निर्देशिका के तहत लिखने/चेक-इन की अनुमति न देने के लिए डीएवी सर्वर को कॉन्फ़िगर कर सकते हैं। मैंने यह कोशिश नहीं की है, और यह आपको टैग बनाने के लिए http यूआरएल का उपयोग करने से रोक सकता है (आपको होस्टिंग मशीन पर एक खोल से फ़ाइल पथ का उपयोग करना होगा)। लेकिन सभी व्यावहारिक उद्देश्यों के लिए, कुछ मनमानी पाठ-स्ट्रिंग की तुलना में, आपकी रिलीज़ प्रक्रिया विशिष्ट संशोधन संख्या में अधिक रुचि लेनी चाहिए। उत्तरार्द्ध रिलीज के बाद बदला जा सकता है; पूर्व में [*] हमेशा आपको फ़ाइलों को सटीक उसी सेट तक पहुंच प्रदान करना चाहिए जब भी आप इसे चेक आउट करते हैं।

[*] दृश्यों के पीछे फ़ाइलों के साथ घूमने का हमेशा एक तरीका है, तथ्य के बाद ... मैं आरसीएस और सीवीएस फ़ाइलों को हाथ से संपादित करता था जब मुझे कोई टिप्पणी ठीक करने की आवश्यकता होती थी।लेकिन कुछ गंभीर svn-cleverness के बिना, एक दिया संशोधन संख्या काफी स्थिर होना चाहिए।

<!-- First, we need to get the svn repository root URL by parsing 
the output of 'svn info'. --> 
<exec executable="svn" failonerror="yes"> 
    <arg line="info"/> 

    <redirector outputproperty="svninfo.out" errorproperty="svninfo.err"> 
     <outputfilterchain> 
      <linecontains> 
       <contains value="Repository Root: "/> 
      </linecontains> 

      <tokenfilter> 
       <replacestring from="Repository Root: " to=""/> 
      </tokenfilter> 
     </outputfilterchain> 
    </redirector> 
</exec> 

<echo level="verbose" message="Root from svn info: ${svninfo.out}"/> 

<!-- Set the svn.root property from the svn info output, and append 
the module prefix if it exists. The module prefix allows multiple 
projects to use the same repository root. --> 
<condition property="svn.root" value="${svninfo.out}/${svn.module.prefix}"> 
    <isset property="svn.module.prefix"/> 
</condition> 
<!-- Note that the next line will have no effect if the property was 
set in the condition above, since ant properties are immutable. The 
effect is an "else", if the condition above is NOT true. --> 
<property name="svn.root" value="${svninfo.out}"/> 
<echo level="verbose" message="Root: ${svn.root}"/> 

<!-- Verify the tags directory exists. --> 
<exec executable="svn" 
     failonerror="no" 
     outputproperty="null" 
     errorproperty="svn.ls.error"> 
    <arg line="ls ${svn.root}/tags"/> 
</exec> 
<fail> 
Cannot find 'tags' subdirectory. 

${svn.ls.error} 

The subversion repository is expected to have 'trunk', 'branches', and 'tags' 
subdirectories. The tag '${tag}' will need to be manually created. 
    <condition> 
     <not> 
      <equals arg1="${svn.ls.error}" arg2="" trim="yes"/> 
     </not> 
    </condition> 
</fail> 

<!-- Finally, do the actual tag (copy in subversion). --> 
<exec executable="svn" failonerror="yes"> 
    <arg line="cp . ${svn.root}/tags/${tag} -m 'Created tag ${tag}'"/> 
</exec> 

मैं यह भी कहना है कि मैं टैगिंग के संबंध में सीवीएस और तोड़फोड़ के बीच मतभेद के बारे में पता कर रहा हूँ चाहते हैं, और है कि तोड़फोड़:

+0

मैं ये सब समझता हूं, लेकिन यह प्रासंगिक नहीं है। मेरे ग्राहक एक प्रतीकात्मक टैग नाम चाहते हैं, संशोधन नहीं। यह बदलने वाला नहीं है (मैंने कोशिश की है)। –

+3

जिस तरह से एसवीएन अपने बेवकूफ टैग करता है। अनुक्रमित फ़ाइल में tuples rev-number <-> टैग-नाम की सूची क्यों है और इसे एक शब्दकोश के रूप में उपयोग करें? – user2427

+1

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