2010-07-21 13 views
12

हम एकाधिक सर्वरों पर कोड कैसे दबा सकते हैं? हमारे पास कई सर्वर हैं जिनके पास कोड की एक ही प्रति होना आवश्यक है। व्यक्तिगत सर्वर को धक्का देना मुश्किल है। मुझे पता है कि Mercurial हुक है लेकिन उनमें से कोई भी एक उचित समाधान देता है।Mercurial द्वारा एकाधिक सर्वरों को कोड कैसे धक्का दें?

उत्तर

19

:

[paths] 
default = http://server1 
server2 = http://server2 

और फिर एक है। ,

[paths] 
server2=http://server2 
server3=http://server3 
[hooks] 
changegroup.server2 = hg push -f server2 
changegroup.server3 = hg push -f server3 

आपको एक ही ईवेंट के लिए कई हुक हो सकता है इतना है कि एक मुद्दा नहीं होना चाहिए:

तो अपने केंद्रीय सर्वर निम्नलिखित hgrc होगा।
परिवर्तन हुक पर परिवर्तन समूह हुक का लाभ यह है कि यह बहुत कम बार चलाया जाता है।

+2

यह सबसे अच्छा समाधान है क्योंकि यह केवल तभी ट्रिगर किया जाएगा जब सर्वर 1 पर पुश सफल हो। यदि आप ब्रांची इतिहास के साथ काम कर रहे हैं तो आपको शायद उन परिवर्तन समूह हुक लाइनों में 'पुश-एफ' की आवश्यकता होगी। –

+1

जोड़ा गया -f विकल्प –

+0

कोड को इसके लिए काम करने की आवश्यकता है। Mercurial आपको [प्रति घटना कई क्रियाएं करने की सुविधा देता है] (http://hgbook.red-bean.com/read/handling-repository-events-with-hooks.html) ** अंत में एक एक्सटेंशन जोड़कर ** हुक का नाम आप हुक का नाम देकर एक हुक का नाम बढ़ाते हैं, उसके बाद पूर्ण स्टॉप ("।" वर्ण) के बाद, आपके चयन के कुछ और पाठ होते हैं। उदाहरण के लिए, जब ईवेंट घटना होती है तो Mercurial commit.foo और commit.बार दोनों चलाएगा। –

1

आपकी .hg/hgrc फ़ाइल में आपके पास [paths] निर्देश होना चाहिए, जिसमें आपका डिफ़ॉल्ट स्थान शामिल है। की तरह कुछ जोड़ने के बारे में क्या: यदि आप एक changegroup हुक बनाने के अपने केंद्रीय सर्वर में

hg push default 
hg push server2 
+2

हाँ यह समस्या है। मुझे यह समाधान पता है, जो मैं चाहता हूं वह एक हुक या ट्रिगर है जो सर्वर 1 के लिए सफल धक्का पर, सर्वर 2 पर धक्का स्वचालित रूप से शुरू किया जाता है। उपरोक्त समाधान हमेशा एक सर्वर को धक्का देने के लिए भूलने का मौका है। वैसे, एक त्वरित उत्तर के लिए धन्यवाद। – Akshay

+0

मुझे स्वचालित पुश चेन समस्या का सामना करना पड़ा है। क्या यह हल करता है या नहीं? –

0

मुझे लगता है कि सर्वरों में से एक मास्टर रेपो है, शेष तैनाती हैं। ऐसी स्थिति में, मैं सिर्फ मास्टर के साथ बातचीत करता हूं और तैयारी को क्रॉन तक छोड़ देता हूं:

cat >$HOME/bin/dist <<'EOM' 
#!/bin/sh 
cd ${1:?} 
tip=$(hg tip --template '{node}') 
for r in $remotes; do 
    hg push -r $tip $r 
done 
EOM 

chmod +x $HOME/bin/dist 
(crontab -l; echo '*/5 * * * * $HOME/bin/dist /var/repos/master') | crontab - 
+0

हुह .. क्या होगा यदि एक से अधिक प्रतिबद्धताओं को 5 मिलियन से भी कम समय में धक्का दिया गया हो? :-)। इस मामले में एक "परिवर्तन समूह" हुक सेट करना बेहतर है। साथ ही जब कोई परिवर्तन एक शाखा बना रहा है, तो -फ विकल्प (बल) के साथ धक्का देना आवश्यक होगा। मेरी सलाह, यदि आप एक हुक के बजाय क्रॉन का उपयोग करना चाहते हैं, तो इसे दूरस्थ मशीनों पर सेट करना होगा जो नियमित रूप से परिवर्तन खींचेंगे: इस तरह, एक से अधिक परिवर्तनों को खींच लिया जा सकता है (ताकि आप हर घंटे भी खींच सकें उदाहरण), और खींचने के लिए -f विकल्प की आवश्यकता नहीं है। बस मेरे 0.02 €। चीयर्स, क्रिस्टोफ़े। –

+1

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

+0

@ ry4an: आप 'tip' नाम का उपयोग नहीं कर सकते हैं, क्योंकि स्क्रिप्ट सर्वर 1 से सर्वर 3 तक पहुंचने से पहले यह एक अलग परिवर्तन को इंगित कर सकता है।यही कारण है कि आप केवल '-r' नहीं छोड़ सकते हैं: यदि आप चाहते हैं कि सभी दर्पणों को प्रत्येक धक्का के बाद एक ही टिप हो, तो आपको पूरी स्क्रिप्ट के लिए एक ही संशोधन के साथ चिपकने की आवश्यकता है। हालांकि, '-f' टिप्पणी मान्य है। –

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