SVN में अंतिम संशोधन संख्या प्राप्त करना?


103

PHP, पर्ल, या पायथन (अधिमानतः PHP) का उपयोग करते हुए, मुझे एक SVN डेटाबेस को क्वेरी करने और SVN को भेजे गए अंतिम संशोधन संख्या का पता लगाने की आवश्यकता है। मुझे इसके अलावा किसी और चीज की जरूरत नहीं है। इसे गैर-गहन होने की आवश्यकता है (इसलिए मैं इसे क्रोन जॉब के रूप में हर 5 मिनट में करता हूं; एसवीएन का प्रदर्शन प्रभावित नहीं होना चाहिए)।

एसवीएन मेरे इंट्रानेट पर स्थित है, लेकिन मेरे विशिष्ट कंप्यूटर पर नहीं।

मेरे पास एसवीएन स्थापित है, लेकिन PHP / पर्ल / पायथन के लिए कोई बाइंडिंग स्थापित नहीं है। मैं विंडोज़ एक्सपी चला रहा हूं, लेकिन मैं एक प्लेटफ़ॉर्म-स्वतंत्र समाधान पसंद करूंगा जो लिनक्स में भी काम कर सकता है। यदि आपके पास लिनक्स-ओनली (या केवल XP) समाधान है, तो यह भी मददगार होगा।


2
"svn info --show-item revision" वर्तमान संशोधन को देगा, जिसमें वर्तमान निर्देशिका को अपडेट किया गया है।
GreatAndPowerfulOz

1
$ svn info --show-item revision svn: invalid option: --show-itemApache Subversion 1.8.16 (r1740329) संकलित Apr 26 2016 का उपयोग करना। इसके अलावा CollabNet 1.6.11 (r934486) के साथ 6 मार्च 2014 को संकलित करने की कोशिश की।
23

इन टिप्पणियों के संबंध में, बाहर की जाँच svn help infoके लिए कानूनी विकल्पों के लिएsvn info
XavierStuvw

@IceArdor मैं SVN v1.9.5 का उपयोग कर रहा हूं और --show-itemउपलब्ध है
icc97

जवाबों:


68
<?php
    $url = 'your repository here';
    $output = `svn info $url`;
    echo "<pre>$output</pre>";
?>

आप XML में आउटपुट प्राप्त कर सकते हैं जैसे:

$output = `svn info $url --xml`;

यदि कोई त्रुटि है, तो आउटपुट को stderr को निर्देशित किया जाएगा। इस प्रकार अपने उत्पादन उपयोग में stderr पर कब्जा करने के लिए:

$output = `svn info $url 2>&1`;

2
यदि कोई त्रुटि है, तो आउटपुट को stderr को निर्देशित किया जाएगा। अपने आउटपुट में stderr को इस प्रकार पकड़ने के लिए: $ आउटपुट = svn info $url 2>&1;
डैनियल एक्स मूर

3
धन्यवाद! मैंने अपने स्वयं के C # टूल का निर्माण करने के लिए --xml का उपयोग किया है जो मुझे असेंबली फ़ाइलविज़न विशेषता बनाने में मदद करता है। पुनश्च: अंग्रेजी मेरी प्राथमिक भाषा नहीं है और मुझे इस तरह से 'इस तरह से' शब्द मिला है, जो मैंने पहले कभी नहीं सुना था। Btw, इसका मूल बल्कि मज़ेदार है: cf ( en.wiktionary.org/wiki/thusly ); क्या आपने इसे जानबूझकर (दंड?) का उपयोग किया है या आपके लिए इस तरह के बजाय सामान्य रूप से उपयोग करना सामान्य है?
odalet

7
svn info $url | grep 'Last Changed Rev' | awk '{ print $4; }'
कोबरा_फास्ट

7
@Cobra_Fast, आपको पाइप की आवश्यकता नहीं है, आप कर सकते हैं svn info --show-item revision $urlया कर सकते हैं svn info --show-item last-changed-revision $url
cp.engr

2
@ cp.engr का मानना ​​है कि यह केवल SVN v1.9 के बाद से है या इसलिए - कि यह v1.9.5 में है और यह v1.8.6 में मौजूद नहीं है
icc97

131

यदि आप एक स्थानीय कामकाजी प्रतिलिपि का विश्लेषण करना चाहते हैं, तो सबसे अच्छा उपकरण है svnversion, जो सबवर्सन के साथ आता है और जैसे आउटपुट का उत्पादन करता है 968:1000M। प्रलेखन कहता है:

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

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

2
सहमत, svn जानकारी से बेहतर
रिचर्ड

32
svnversion स्थानीय कामकाजी प्रतियों के लिए है, और प्रश्न में निर्दिष्ट अनुसार इंट्रानेट पर रिपॉजिटरी तक नहीं पहुंचेगा।
डैनियल एक्स मूर

5
उन लोगों के लिए जो svnversion से परिचित नहीं हैं, यह मानक कमांड-लाइन क्लाइंट का हिस्सा है और यहाँ मैन्युअल पेज है: svnbook.red-bean.com/nightly/en/svn.ref.svnversion.re.html
माइकल सोरेंस

45

svn info -r HEAD

यह आपको अपने रिपॉजिटरी के प्रमुख में नवीनतम संशोधन संख्या देगा।

आपके निर्माण स्क्रिप्ट में तोड़फोड़ संख्या को एकीकृत करने के बारे में कुछ अच्छे ब्लॉग पोस्ट हैं:


यह सबसे आसान तरीका है क्योंकि आपको पहले रिपॉजिटरी url का पता नहीं लगाना है। धन्यवाद!
derFunk

मुझे हेड के आसपास के उद्धरणों का उपयोग करने में त्रुटियां svn info -r HEAD
हुईं

38

यह कार्यशील निर्देशिका से बैश में काम करना चाहिए। मैंने इसे विंडोज में यूनिक्स के साथ स्थापित किया है:

svn info |grep Revision: |cut -c11-

यह काम करता है यदि आप रिपॉजिटरी URL को डालते हैं जहाँ आपके पास% * है, जो भी आप इसका मतलब है। कटौती का अच्छा सिंटैक्स, पहले यह नहीं जानता था।
ypnos

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

4
इसके अलावा, यह SVN के स्थानीयकृत संस्करणों के लिए काम नहीं करता है (पोलिश में यह कट -c9- होगा)।
ज़गोडा

2
यही कारण है कि, btw, यही कारण है कि मैं स्थानीय कमांड लाइन डेवलपर टूल को दृढ़ता से नापसंद करता हूं; शून्य लाभ, समस्याओं का गुच्छा। मैं आमतौर पर इस कारण से स्थानीयकरणों को हटा देता हूं।
जिम्पफ

7
चरित्र गणना के बजाय एक सीमांकक पास करना स्थानीयकृत सामग्री के लिए सबसे अच्छा काम करता है, उदाहरण के लिए svn info | grep Revision | cut -d " " -f 2रिक्त स्थान का उपयोग करके विभाजित होने के बाद दूसरा स्ट्रिंग लौटाएगा।
बुटीफरा

34

निम्नलिखित काम करना चाहिए:

svnlook youngest <repo-path>

यह एकल संशोधन संख्या देता है।


15

वास्तव में अपने दूरस्थ रिस्पांसरी पर नवीनतम संशोधन ("हेड रिवीजन") संख्या प्राप्त करने के लिए , इसका उपयोग करें:

svn info -r 'HEAD' | grep Revision | egrep -o "[0-9]+"

उदाहरण के लिए आउटपुट:

35669

12

नवीनतम संशोधन संख्या प्राप्त करने के बारे में एक नोट:

मान cdलीजिए कि मैं एक पुनरीक्षित उपनिर्देशिका ( MyProjectDir) में हूं । फिर, अगर मैं फोन करता हूं svnversion:

$ svnversion .
323:340

... मुझे " 323:340" मिलता है , जो मुझे लगता है कि इसका मतलब है: " आपको यहां आइटम मिल गए हैं, संशोधन 323 से 340 तक "।

 

फिर, अगर मैं फोन करता हूं svn info:

$ svn info
Path: .
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 323
Node Kind: directory
Schedule: normal
Last Changed Author: USER
Last Changed Rev: 323
Last Changed Date: 2011-11-09 18:34:34 +0000 (Wed, 09 Nov 2011)

... मुझे " 323" संशोधन के रूप में मिलता है - जो वास्तव में उन लोगों का सबसे कम संशोधन है, जिनके द्वारा रिपोर्ट किया गया था svnversion!

 

फिर हम svn infoस्थानीय निर्देशिका से अधिक जानकारी प्राप्त करने के लिए पुनरावर्ती मोड में उपयोग कर सकते हैं :

> svn info -R | grep 'Path\|Revision'
Path: .
Revision: 323
Path: file1.txt
Revision: 333
Path: file2.txt
Revision: 327
Path: file3.txt
Revision: 323
Path: subdirA
Revision: 328
Path: subdirA/file1.txt
Revision: 339
Path: subdirA/file1.txt
Revision: 340
Path: file1.txt
Revision: 323
...

... ( grepअधिक विवरण देखने के लिए निकालें )।

 

अंत में, क्या करना है जब हम जांचना चाहते हैं कि ऑनलाइन रिपॉजिटरी (इस मामले में, @ server.com) का नवीनतम संशोधन क्या है ? फिर हम फिर से जारी करते हैं svn info, लेकिन -r HEAD( -Rपहले पूंजी विकल्प के बीच अंतर पर ध्यान दें , और -rअब लोअरकेस करें ):

> svn info -r 'HEAD'
USER@server.com's password:
Path: MyProjectDir
URL: svn+ssh://server.com/path/to/MyProject/MyProjectDir
Repository Root: svn+ssh://server.com/path/to/MyProject
Repository UUID: 0000ffff-ffff-...
Revision: 340
Node Kind: directory
Last Changed Author: USER
Last Changed Rev: 340
Last Changed Date: 2011-11-11 01:53:50 +0000 (Fri, 11 Nov 2011)

दिलचस्प बात यह है - svn infoअभी भी वर्तमान उपनिर्देशिका ( MyProjectDir) को संदर्भित करता है , हालांकि, ऑनलाइन पथ के रूप में रिपोर्ट किया जाता है MyProjectDir( .स्थानीय मामले के लिए विरोध किया जाता है ) - और रिपोर्ट किए गए ऑनलाइन संशोधन उच्चतम है ( 340- सबसे कम के विपरीत, 323रिपोर्ट किया गया है) स्थानीय स्तर पर)।


9
  • तोड़फोड़ 1.9 के साथ शुरू करके आप कमांड के आउटपुट के क्षेत्रों में से एक का मूल्य प्राप्त करने के लिए विकल्प -शो-आइटम का उपयोग कर सकते हैं svn info। यह आदेश केवल संशोधन संख्या प्रदर्शित करेगा:

    svn info --show-item=revision <URL-to-repository>
    
  • --xmlविकल्प का उपयोग करके svn जानकारी के XMLed आउटपुट प्राप्त करें और संशोधन संख्या प्राप्त करने के लिए PowerShell का उपयोग करें। ये रहा एक सरल उदाहरण:

    [xml]$svninfo = svn info <REPOSITORY-URL> --xml -r HEAD
    $latestrevnum = $svninfo.info.entry.revision
    $latestrevnum
    
  • VisualSVN सर्वर 3.4 या नए का उपयोग करते हुए, आप इन आदेशों को चलाकर रिपॉजिटरी में संशोधन की संख्या प्राप्त कर सकते हैं:

    $repo = Get-SvnRepository <REPOSITORY-NAME>

    $repo.Revisions

    देखें Get-SvnRepositoryPowerShell संदर्भ cmdlet अधिक जानकारी के लिए।


7

मुझे लगता है कि आप ढूंढ रहे हैं

svn info -r HEAD

क्या आप उस कमांड को खोल सकते हैं?

आपको शायद रिपॉजिटरी के साथ लॉगिन क्रेडेंशियल भी प्रदान करने की आवश्यकता होगी।


मुझे लगता है कि यह svn जानकारी -r HEAD
स्टीफन

-r आसानी से तब ommited हो सकता है।
ypnos

सही - मैंने -r के लिए विकल्प को निर्दिष्ट नहीं किया है - यह सिर्फ उसके लिए है कि उसे क्या चाहिए और मदद / पुस्तक के साथ शुरुआत करें।
टिम

4

किसी और ने मुझे इस बारे में जवाब पोस्ट करने के लिए पीटा svnversion, जो निश्चित रूप से सबसे अच्छा समाधान है यदि आपके पास काम की प्रतिलिपि है (आईआईआरसी, यह यूआरएल के साथ काम नहीं करता है)। मैं इसे जोड़ूंगा: यदि आप SVN होस्ट करने वाले सर्वर पर हैं, तो svnlookकमांड का उपयोग करने का सबसे अच्छा तरीका है । यह वह कमांड है जो आप हुक स्क्रिप्ट लिखते समय रिपॉजिटरी का निरीक्षण करने के लिए (और यहां तक ​​कि मौजूदा लेन-देन में, प्री-कमिट हुक के मामले में) करते हैं। आप svnlook helpविवरण के लिए टाइप कर सकते हैं । आप शायद svnlook youngestकमांड का उपयोग करना चाहते हैं । ध्यान दें कि इसके लिए रेपो निर्देशिका तक सीधी पहुंच की आवश्यकता होती है, इसलिए इसे सर्वर पर उपयोग किया जाना चाहिए।


2
nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svnversion
12354

या

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml |     xmlstarlet sel -t --value-of "//entry/@revision"
12354

या

nickh@SCLLNHENRY:~/Work/standingcloud/svn/main/trunk/dev/scripts$ svn info --xml | xmlstarlet sel -t --value-of "//commit/@revision"
12335

2

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

1)
> svn info | awk '/Revision:/ { print $2 }' =>returns the latest version


2)
> svn log -l 1 | grep '^r[0-9]\+' | awk '{print $1}'

svn log -l 1     => returns the latest version commit 
grep '^r[0-9]\+' => greps the r4324 (revision) number
awk '{print $1}' => prints the match found


2

यदि आपको Windows बैच फ़ाइल से ऐसा करने की आवश्यकता का दुर्भाग्य है, तो यहां जो आप देख रहे हैं, वह है:

set REV=unknown
for /f "usebackq tokens=1,2 delims=: " %%A in (`svn info`) do if "%%A" == "Revision" set REV=%%B
echo Current SVN revision is %REV%

यह "svn जानकारी" चलाता है, उत्पन्न आउटपुट की प्रत्येक पंक्ति के माध्यम से पुनरावृत्ति करता है। यह लाइन पर पहले और दूसरे टोकन के बीच एक सीमांकक के रूप में एक बृहदान्त्र का उपयोग करता है। जब पहला टोकन "रिविजन" होता है तो यह पर्यावरण चर REV को दूसरे टोकन पर सेट करता है।


1
आप FINDSTR का उपयोग कर सकते हैं:FOR /F "tokens=2" %%i IN ('svn info ^| FINDSTR Revision:') DO SET revision=%%i
icc97

इस आधार पर अन्य एसओ उत्तर देखें
icc97

2

आप एक कॉल की तलाश में हैं जो कमांडलाइन कॉल के समान है

svn info URL

ऐसा लगता है कि यह pysvn पुस्तकालय का उपयोग करना संभव है, और एक नुस्खा है जो आपको शुरू करने में मदद करना चाहिए। मुझे यकीन नहीं है कि अगर PHP के लिए कुछ समान है।

यदि आपको स्वयं एसवीएन बाइनरी कॉल करने का सहारा लेने की आवश्यकता है, तो --xmlXML के रूप में परिणाम प्राप्त करने के लिए पैरामीटर का उपयोग करना सुनिश्चित करें । कमांडलाइन आउटपुट की तुलना में पार्स करना आसान होना चाहिए।


मैं subprocess.check_outputएक और पुस्तकालय कॉल से बचने के लिए अजगर में उपयोग करता हूं । यदि आप केवल संशोधन संख्या की जाँच कर रहे हैं / नवीनतम प्रतियों को नीचे खींच रहे हैं, तो कमांडलाइन से svn का उपयोग करना सरल है subprocess। अब, यदि आप स्वचालित चेक-इन और मर्ज कर रहे हैं ...
Droogans

2

आप उदाहरण के लिए XML आउट प्रारूप का उपयोग कर सकते हैं:

  svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +

उदाहरण: संशोधन संख्या का उपयोग करना

working=`svn info --xml | grep 'revision' | head -1 | grep -Eo "[0-9]+" | xargs expr -1 +`
svn diff -r $working:HEAD --summarize --xml

2

आप नीचे दिए गए आदेश की कोशिश कर सकते हैं:

svn info -r 'HEAD' | grep Revision: | awk -F' ' '{print $2}'

1

बस svn infoBASH में आपको सारी जानकारी देनी होगी

RESULT:
Path: .
URL: 
Repository Root: 
Repository UUID: 
Revision: 54
Node Kind: directory
Schedule: normal
Last Changed Author: 
Last Changed Rev: 54
Last Changed Date: 

इससे आपको REVISION मिलेगा


1

ऐसा करने का सबसे सरल और साफ तरीका (वास्तव में svn 1.9, 2015 को जारी) उपयोग कर रहा है:

svn info --show-item revision [--no-newline] [SVNURL/SVNPATH] 

आउटपुट SVNURL के लिए अंतिम पुनरीक्षण (जॉन्स्ट) की संख्या है, या SVNPATH की वर्तमान प्रतिलिपि के संशोधन की संख्या है । --no-newlineवैकल्पिक है, निर्देश देता है svn(एक कॉस्मेटिक न्यू लाइन फेंकना नहीं \n) मूल्य के बाद, यदि आप कम से कम उत्पादन (केवल संशोधन संख्या) की जरूरत है।

देखें: https://subversion.apache.org/docs/release-notes/1.9.html#svn-inver-nem


1
मैंने svn 1.9.3 पर कोशिश की, और यहाँ कमांड हैsvn info --show-item--show item
elopio

0

जब बाहरी उपयोग किए जा रहे हों तो पोस्ट किए गए समाधान मामले को नहीं संभालते हैं।

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

तो आप या तो svn:externalsसंपत्ति प्राप्त करें और URL पर पुनरावृति करें और ऊंचाइयों के संशोधन को चुनें या आधार URL को तोड़फोड़ सर्वर से क्वेरी करें। बेस URL से रिपोर्ट किए गए संस्करण में सर्वर पर हर किसी के लिए नवीनतम संशोधन शामिल होगा।

इसलिए, यदि आप बाहरी उपयोग कर रहे हैं, तो यह उपयोग करना सबसे अच्छा है कि सबवर्सन सर्वर पर सभी पथों के लिए रूट URL svn info BASE_URLकहां BASE_URLहै।


0

यह अंतिम परिवर्तित संशोधन की सिर्फ संशोधन संख्या प्राप्त करेगा:

<?php
$REV="";
$repo = ""; #url or directory
$REV = svn info $repo --show-item last-changed-revision;
?>

आशा है कि ये आपकी मदद करेगा।


0

$ svn log | head -10 एक .svnफ़ोल्डर है जो भी निर्देशिका पर


0

svn infoया svnversionउप-श्रेणियों पर विचार नहीं करेगा, लाइव कोडबेस के नवीनतम 'संशोधन' को खोजने के लिए नीचे हैक किए गए तरीके ने मेरे लिए काम किया - इसे चलाने में कुछ समय लग सकता है:

repo_root$ find ./ | xargs -l svn info  | grep 'Revision: ' | sort
...
Revision: 86
Revision: 86
Revision: 89
Revision: 90
$

0

यह "एसवीएन" पुस्तकालय का उपयोग करके प्राप्त किया जा सकता है :

import svn.remote

file_path = "enter your filepath"

svn_inf = svn.remote.RemoteClient(file_path)

head_revision = ([x for x in svn_inf.log_default(revision_to = 'HEAD')] [-1]).revision

Head_revision में फ़ाइल का नवीनतम संशोधन नंबर होना चाहिए


-1

ऐसा लगता है कि इसके लिए आधिकारिक FAQ में एक प्रविष्टि है । स्रोत कोड C में है, लेकिन समान सिद्धांत लागू होता है, जैसा कि इस मेलिंग सूची पोस्ट में यहां दिया गया है


यह एक महान उपकरण / उत्तर है, लेकिन मुझे नहीं लगता कि उसे इतनी आवश्यकता है - मैंने इसे केवल नवीनतम संशोधन की आवश्यकता के लिए समझा था, इसलिए शायद वह एक निर्माण शुरू कर सकता है यदि उसका वर्तमान संशोधन पिछले चेक से अलग है। शायद मुझे गलत समझा गया।
टिम

-1

अपडेट: तोड़फोड़ 1.9 एक नए आदेश "svn सबसे कम उम्र" का समर्थन करेगा जो केवल नवीनतम संशोधन संख्या को आउटपुट करता है। "Svnlook युवा" के लिए अंतर यह है कि "svn सबसे कम उम्र" भी दूर से काम करता है।

http://subversion.tigris.org/issues/show_bug.cgi?id=4299

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