2010-01-02 11 views
44

क्या वर्तमान संशोधन संख्या दिखाने के लिए कोई सबवर्सन कमांड है?वर्तमान सबवर्जन संशोधन आदेश

svn checkout के बाद मैं एक स्क्रिप्ट शुरू करना चाहता हूं और एक चर में संशोधन संख्या की आवश्यकता है। svn info get_revision_number जैसे कमांड होने पर यह बहुत अच्छा होगा।

+8

नवीनतम SVN के साथ, 'svn जानकारी --show-आइटम revision' मौजूदा निर्देशिका में स्रोत का सिर्फ संशोधन संख्या दिखाएगा। – GreatAndPowerfulOz

+1

अपनी स्थानीय कार्यशील प्रतिलिपि की संशोधन संख्या प्राप्त करने के लिए, 'svn info --show-item last-change-revision' – domih

उत्तर

72

आप इस प्रकार का कमांड लाइन पर अमल करने os.system() उपयोग कर सकते हैं:

svn info | grep "Revision" | awk '{print $2}' 

मेरी हर रात को निर्माण लिपियों में है कि मुझे क्या करना।

कुछ प्लेटफार्मों पर भी svnversion कमांड है, लेकिन मुझे लगता है कि मेरे पास इसका उपयोग करने का कोई कारण नहीं था। आह, ठीक है। Svnversion का उपयोग कर स्थानीय को इसकी तुलना करने के लिए आपको रिमोट रिपोजिटरी से संशोधन संख्या नहीं मिल सकती है।

+1

ध्यान दें कि मूल प्रश्न में 'cmd.exe' टैग था, जिसका मतलब है कि ओपी विंडोज में है, जहां आप' grep' और 'awk' का उपयोग नहीं कर सकते हैं। – iamamac

+1

os.system केवल आपको निकास कोड बताता है, यह आउटपुट प्राप्त करने का कोई तरीका प्रदान नहीं करता है। इसके बजाए, 'svn info' (जैसे subprocess मॉड्यूल के साथ) निष्पादित करना, आउटपुट पढ़ना और सीधे पायथन में grep/awk चरणों को करना ('अगर" रेविजन "लाइन में: वापसी line.split() [1]') है आमतौर पर पाइथन में बैश कमांड लिखने की कोशिश करने से सरल और आसान दोनों। –

+0

Iamamac: साइगविन और स्वतंत्र बंदरगाह (प्लस एसएफयू और जो भी एमएसएफटी अब इसे कॉल करता है) है, लेकिन आपका मुद्दा यह है कि यह आमतौर पर उपलब्ध नहीं है। –

2

svn info, मुझे विश्वास है, जो आप चाहते हैं।

तुम सिर्फ संशोधन चाहते हैं, तो हो सकता है आप की तरह कुछ कर सकता है:

svn info | grep "Revision:" 
22

वहाँ भी (कुछ के लिए) एक और अधिक सुविधाजनक है svnversion आदेश।

4123:4168  mixed revision working copy 
    4168M   modified working copy 
    4123S   switched working copy 
    4123:4168MS mixed revision, modified, switched working copy 

मैं इस अजगर कोड का उपयोग करते संशोधन जानकारी निकालने के लिए:

आउटपुट एक भी संशोधन संख्या या कुछ इस तरह (-h से) हो सकता है

import re 
import subprocess 

p = subprocess.Popen(["svnversion"], stdout = subprocess.PIPE, 
    stderr = subprocess.PIPE) 
p.wait() 
m = re.match(r'(|\d+M?S?):?(\d+)(M?)S?', p.stdout.read()) 
rev = int(m.group(2)) 
if m.group(3) == 'M': 
    rev += 1 
4
  1. पहले सभी svn स्थिति में संशोधन संख्या है, आप इसे वहां से पढ़ सकते हैं।

  2. इसके अलावा, प्रत्येक फ़ाइल है कि आप SVN में स्टोर अपने आप में संशोधन संख्या स्टोर कर सकते हैं - आपकी फ़ाइल और रन propset को $Rev$ कीवर्ड जोड़ने: svn propset svn:keywords "Revision" file

  3. अंत में, संशोधन संख्या .svn/entries फ़ाइल में भी है , चौथी रेखा

अब जब भी आप उस फ़ाइल को चेकआउट करते हैं, तो इसमें स्वयं संशोधन होगा।

+0

आइटम 3 के लिए, क्या यह उम्मीद करना उचित है कि संशोधन संख्या हमेशा चौथी पंक्ति पर होगी? यदि यह उचित अपेक्षा है, तो यह किसी भी पर्यावरण में इसे करने का सबसे आसान तरीका है। – grimus

+0

हां, कम से कम एक समझदार उपवर्तन संस्करण सीमा में। अगर वे कुछ भविष्य के संस्करण में प्रारूप बदलते हैं (संभव है लेकिन जल्द ही संभव नहीं है) तो आपको अनुकूलित करना होगा। –

+0

मैंने इसे थोड़ा सा देखा, और यह पाया: http://svnbook.red-bean.com/en/1.4/svn.developer.insidewc.html ऐसा लगता है कि स्वरूप समय-समय पर बदल सकता है । मुझे यकीन है कि ज्यादातर चीजों के लिए, प्रविष्टियां फ़ाइल पढ़ने से ठीक काम होगा, लेकिन प्रविष्टियों फ़ाइल में बदलाव होने पर आपको अपना कोड बनाए रखना सुनिश्चित करना होगा। – grimus

0

मुझे लगता है कि मैं जानकारी SVN और फिर से एक स्ट्रिंग हेरफेर के साथ संख्या को पुनः प्राप्त करने के लिए है "संशोधन: XXXXXX" यह सिर्फ अच्छा होगा, अगर वहाँ एक आदेश है कि बस संख्या :)

2

रिटर्न थे निम्नलिखित की तरह कुछ का उपयोग करें, तोड़फोड़ के XML आउटपुट का लाभ लेने:

# parse rev from popen "svn info --xml" 
dom = xml.dom.minidom.parse(os.popen('svn info --xml')) 
entry = dom.getElementsByTagName('entry')[0] 
revision = entry.getAttribute('revision') 

भी ध्यान रखें कि, क्या आप के लिए यह जरूरत पर निर्भर करता है, <commit revision=...> प्रविष्टि अधिक आप जो खोज रहे हैं हो सकता है। यह "आखिरी बदले गए रेव" को देता है, जो तब तक नहीं बदलेगा जब तक कि वर्तमान पेड़ में कोड वास्तव में परिवर्तित नहीं होता है, जैसा कि "संशोधन" (उपरोक्त क्या देता है) के विपरीत होता है जो किसी भी समय भंडार परिवर्तन (यहां तक ​​कि शाखाओं) में कुछ भी बदल देगा। और आप एक "svn up" करते हैं, जो एक ही बात नहीं है, न ही अक्सर उपयोगी है।विंडोज दुनिया SubWCRev, जो ठीक से इस्तेमाल किया, आवश्यक डेटा की जरूरत स्थानों में पूर्ण रूप से अपने फार्म में स्थानापन्न कर सकते हैं, अगर स्क्रिप्ट कॉल SubWCRev SubWCRev WC_PATH TPL-FILE READY-FILE

मेरी पोस्ट-लिखें हुक का नमूना (का हिस्सा) के लिए

+0

एसवीएन को आउटपुट एक्सएमएल से पूछना और फिर इसे पार्स करना? क्या यह मजाक के रूप में है? –

+1

@ जुलिएन ग्वेर्टॉल्ट, नहीं, एक्सएमएल आउटपुट * मतलब * प्रोग्रामेटिक उपयोग के लिए है, जबकि गैर-एक्सएमएल नहीं है। मानव उत्पादन को पार्स करना भविष्य में बदलने वाले प्रारूप को खतरे में डाल रहा है और आपके कोड को तोड़ रहा है, और प्रत्येक बार आपको समान काम करने की आवश्यकता होने पर संदर्भ के आधार पर कस्टम काम की आवश्यकता हो सकती है। यदि आप एक्सएमएल दृष्टिकोण का उपयोग करते हैं तो आप समय के साथ बुनियादी ढांचे पर प्रयास बचा सकते हैं। कोई मजाक नहीं, लेकिन मैं यह भी नहीं कहूंगा कि यह किसी अन्य तरीके से * गलत * है। बस व्यक्तिगत वरीयता।मैंने अलग-अलग सामग्रियों में दोनों किया है। –

+0

मशीन बनाम मानव आउटपुट पार्सिंग एक मान्य बिंदु है (आपके उत्तर में जोर देने के लायक)। लेकिन क्यों न केवल 'svnversion' का उपयोग करें? इसमें एक दस्तावेज कॉम्पैक्ट आउटपुट है और इस जटिल को कुछ पार्स करने की आवश्यकता नहीं है। –

1

कोई भी उल्लेख

SubWCRev.exe CustomLocations Builder.tpl z:\Builder.bat 
... 
call z:\Builder.bat 

जहाँ मेरे Builder.tpl है

svn.exe export trunk z:\trunk$WCDATE=%Y%m%d$-r$WCREV$ 

परिणाम के रूप में, मैं चर भाग के साथ हर बार बल्ले-फ़ाइल है - nam निर्देशिका का ई - जो कार्य की प्रतिलिपि के मेटाडाटा से मेल खाती है

2

बस, एक संशोधित संस्करण में @ badcat के जवाब इस्तेमाल किया subprocess.check_output() का उपयोग कर: मेरा मानना ​​है कि

import subprocess 
revision = subprocess.check_output("svn info | awk '/^Revision:/ {print $2}'", shell=True).strip() 

आप भी स्थापित करने और pysvn उपयोग करें यदि आप करना चाहते हैं कर सकते हैं svn के साथ इंटरफ़ेस करने के लिए पायथन का उपयोग करें।

3

REV = svn info svn://svn.code.sf.net/p/retroshare/code/trunk | grep 'Revision:' | cut -d\ -f2

+0

ध्यान दें कि रेट्रोशेयर में कुछ सुरक्षा समस्याएं हो सकती हैं http://specialmeaning.blogspot.com/2016/09/retroshare-scandal-of-free-communication.html – Sergei

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