2008-09-21 4 views
30

मैं अपने PHP अनुप्रयोग को संशोधित संख्या के साथ लेबल करना चाहता हूं, लेकिन मैं CruiseControl का उपयोग नहीं करना चाहता हूं या फ़ाइल को अपडेट नहीं करना चाहता हूं और इसे हर बार अपलोड करना चाहता हूं। मैं इसे कैसे करूं?मैं PHP में सबवर्जन संशोधन संख्या कैसे प्राप्त कर सकता हूं?

उत्तर

53

एसवीएन कीवर्ड एक अच्छा समाधान नहीं है। जैसा कि अन्य ने फ़ाइल में $ संशोधन $ जोड़ने को इंगित किया है, केवल विशिष्ट फ़ाइल को प्रभावित करता है, जो लंबे समय तक नहीं बदला जा सकता है।

प्रत्येक प्रतिबद्धता व्यर्थ होने से पहले फ़ाइल को "संपादित करें" (एक खाली रेखा जोड़कर या हटाकर) को याद रखना। आप हाथ से संशोधन टाइप कर सकते हैं।

ऐसा करने का एक अच्छा तरीका (जो मुझे पता है) एक स्वचालित तैनाती प्रक्रिया (जो हमेशा एक अच्छी बात है) और svnversion कमांड का उपयोग करना है। यहां मैं क्या करता हूं:

जहां भी मुझे संशोधन की आवश्यकता है, मैं इसमें शामिल हूं: <?php include 'version.php'; ?>।यह "version.php" फ़ाइल में केवल संशोधन संख्या है। इसके अलावा यह भंडार का हिस्सा नहीं है (इसे अनदेखा करने के लिए सेट किया गया है)। यहां बताया गया है कि मैं इसे कैसे बनाता हूं:

1) उन परियोजनाओं पर जहां सर्वर पर एसवीएन स्थापित है, मैं इसे तैनाती के लिए भी उपयोग करता हूं।

cd /var/www/project 
svn update 
rm version.php 
svnversion > version.php 

2) परियोजनाओं जहां SVN मेरी तैनाती स्क्रिप्ट स्थापित नहीं है पर अधिक जटिल है: सर्वर से नवीनतम संस्करण हो रही है मैं अन्य बातों के अलावा निम्नलिखित (यह सर्वर पर चलाता है) करता है कि एक स्क्रिप्ट है यह स्थानीय रूप से version.php फ़ाइल बनाता है, कोड को ज़िप करता है, अपलोड करता है और इसे

+0

आपके उत्तर की अच्छी बात यह है कि भाषा अज्ञेयवादी है: 'svnversion' टेक्स्ट फ़ाइल पर संशोधन संख्या सहेजता है और यह वह एप्लिकेशन है जिसकी उस फ़ाइल को बाद में उस फ़ाइल तक पहुंचने की आवश्यकता होती है। – AxeEffect

17

तोड़फोड़ पेड़ की एक जाँच-आउट प्रति अपने webroot मानते हुए है, तो आप /.svn/entries फ़ाइल को पार्स सकता है और संशोधन संख्या (यहाँ 4 लाइन) बाहर हुक ...

PHP में:

$svn = File('.svn/entries'); 
$svnrev = $svn[3]; 
unset($svn); 
+7

आपके आवेदन SVN internals पर निर्भर करता है। क्षमा करें, नो-नो –

+11

@ ब्रेंट। लोंगबोरो अगर मैं कर सकता हूं तो मैं आपकी टिप्पणी को कम कर दूंगा, लेकिन मैं नहीं कर सकता, इसलिए मैं इसके बजाय इस टिप्पणी को छोड़ दूंगा। –

+0

दरअसल यह संभावित रूप से "वहां नहीं" svnversion बाइनरी, विंडोज़ सिस्टम, डेवलपर चेकआउट इत्यादि पर विशेष रूप से उपयोग करने से अधिक पोर्टेबल दिखता है –

4
this answer से

:

आप इसे जोड़कर कर सकते हैं अपने कोड में कहीं भी निम्न

$Id:$ 

इसलिए उदाहरण के लिए जेफ किया:

<div id="svnrevision">svn revision: $Id:$</div> 

और जब सर्वर में जाँच $ ईद की जगह: $ वर्तमान संशोधन संख्या के साथ। मुझे this reference भी मिला।

वहाँ भी $ तिथि है: $, $ रेव: $, $ संशोधन: $

+2

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

2

ज्यादातर मामलों में सर्वर पर कोड वास्तव में एक कोड है, न कि चेकआउट के "निर्यात करें" होते हैं , और इसलिए .svn फ़ोल्डर्स नहीं है। कम से कम वह सेटअप है जिसे मैं अक्सर देखता हूं। क्या दूसरों को वास्तव में वेब सर्वर पर अपना कोड जांचते हैं?

+1

नहीं, आप शायद वहां पर हैं। यह शायद एक उत्पादन सर्वर के लिए भी सबसे अच्छा व्यवहार है ... आप शायद नहीं चाहते हैं कि लोग .svn dirs पर snooping। – Oli

+5

मुझे आशा है कि आप निश्चित रूप से अपने सर्वर कॉन्फ़िगरेशन या कम से कम .htaccess में .svn dirs तक पहुंच को अस्वीकार कर दें। अन्यथा, आपका पूरा कोड देखा जा सकता है। –

2

सबवर्सन "कीवर्ड प्रतिस्थापन" का उपयोग करना सबसे आसान तरीका है। एसवीएन पुस्तक में here एक गाइड है (Version Control with Subversion)।

आपको मूल रूप से बस अपनी फ़ाइल में $ $ $ $ $ टेक्स्ट जोड़ना होगा। फिर अपने भंडार में कीवर्ड को सक्षम करें। चेकआउट पर एसवीएन फ़ाइल में संशोधन संख्या को प्रतिस्थापित करेगा।

2

आप SVN Keywords के साथ निकट हो सकते हैं। $ संशोधन जोड़ें $ जहां आप संशोधन दिखाना चाहते हैं, लेकिन यह केवल अंतिम संशोधन दिखाएगा कि विशेष फ़ाइल बदल दी गई थी, इसलिए आपको प्रत्येक बार फ़ाइल में बदलाव करना होगा। किसी भी प्रकार की बाहरी स्क्रिप्ट या पोस्ट-प्रतिबद्ध हुक के बिना वैश्विक संशोधन संख्या प्राप्त करना संभव नहीं है।

0

ऐसा करने की एक और संभावना है कि "तैनाती प्रक्रिया" में वर्णित चरणों को निष्पादित करने वाले क्रॉन को चलाने के लिए (माना जाता है कि यह एक * nix/freeBSD है सर्वर)।

1

तुम भी इसे इस तरह कर सकता है:

$status = @shell_exec('svnversion '.realpath(__FILE__)); 
if (preg_match('/\d+/', $status, $match)) { 
    echo 'Revision: '.$match[0]; 
} 
2

समान प्रश्न "Mark" svn export with revision को मेरी प्रतिक्रिया देखें।

आप संशोधन संख्या कैप्चर करते हैं जब आप निर्यात आप का उपयोग कर सकते हैं:

svn export /path/to/repository | grep ^Exported | sed 's/^[^0-9]\+\([0-9]\+\).*/\1/' > revision.txt 
0

यदि प्रदर्शन:

svn export /path/to/repository | grep ^Exported > revision.txt 

सब कुछ लेकिन संशोधन संख्या, तो आप इस एसईडी आदेश के माध्यम से यह पाइप कर सकते हैं निकालने के लिए एक मुद्दा है, तो आप कर सकते हैं:

exec('svn info /path/to/repository', $output); 
$svn_ver = (int) trim(substr($output[4], strpos($output[4], ':'))); 

यह निश्चित रूप से आपके एच पर निर्भर करता है एक चेकआउट किया, और svn कमांड की उपस्थिति।

3

देर से बिट, लेकिन एक सबवर्जन पोस्ट-प्रतिबद्ध हुक का उपयोग करें। अपने भंडार के हुक फ़ोल्डर में, इस तरह का खोल स्क्रिप्ट बनाने के लिए:

#!/bin/bash 

REPOS="$1" 
REV="$2" 

cd /web/root 
rm -f /web/root/templates/base.html 
/usr/bin/svn update 
/bin/sed -i s/REVISION/$REV/ /web/root/templates/base.html 

यह विशेष रूप से उदाहरण मानता है आपकी लाइव साइट/वेब/जड़ में है और विकास कोड कहीं और आयोजित किया जाता है। जब आप एक dev परिवर्तन करते हैं, तो स्क्रिप्ट पूर्व लाइव टेम्पलेट को हटा देती है (संघर्ष संदेशों से बचने के लिए), अद्यतन को चलाता है और वास्तविक संशोधन संख्या के साथ टेम्पलेट में REVISION की घटनाओं को प्रतिस्थापित करता है।

अधिक हुक here

8

पर यह कैसे मैं यह काम करने के लिए मिल गया है। अपने सर्वर shell_exec अनुमति देने के लिए सेटअप है और आप SVN बस चलाने इंस्टॉल किया है:

$revision = `svnversion`; 

या

$revision = shell_exec('svnversion'); 
+0

कमांड svnversion नहीं है? – grantc

+0

ओह! एक और देर रात होनी चाहिए। धन्यवाद! ठीक किया गया :) –

+3

यह स्वीकार्य उत्तर कैसे नहीं है। ऐसा लगता है कि किसी भी अन्य योजना की तुलना में पूरी तरह से और बेहतर तरीके से काम करता है। आप टेक्स्ट फ़ाइल में सामान भी क्रॉन कर सकते हैं। धन्यवाद! आसान और सही और बिल्कुल ओपी ने क्या पूछा – ladieu

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

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