2010-12-27 12 views
7

मैं गिट में एक अद्यतन हुक जोड़ना चाहता हूं जो लोगों को जावा कोड को धक्का देने से रोकता है जो संकलित नहीं होगा। आदर्श रूप में यह जावैक को कॉल करेगा, नतीजा देखेंगे, या तो पुश को अनुमति या अस्वीकार कर देगा।मैं इसे कैसे बना सकता हूं ताकि गिट कोड को धक्का देकर अस्वीकार कर सके जो संकलित नहीं होगा?

किसी चीज़ का सबसे आम उदाहरण जिसे मैं रोकना चाहता हूं वह है कि कोई भी अपने सभी परिवर्तनों को इस प्रकार तोड़ने से नहीं रोकता है। हालांकि, यह मेरी समझ है कि गिट हुक क्लाइंट (सर्वर नहीं) पर चलते हैं, इसलिए यदि उपर्युक्त होता है तो हुक अभी भी पुश की अनुमति देगा।

लोगों को अधूरे कामों के साथ निर्माण को तोड़ने से रोकने का सबसे अच्छा तरीका क्या है?

अद्यतन:

हुक काम करने की एक आदिम संस्करण मिल गया, सभी मदद के लिए धन्यवाद! अद्यतन हुक से

अंश:

### make sure code compiles 
## currently does this by copying the state of the repository as of the pushed code and attempting to build it 

# for now, hard coded as C:\Windows\Temp 
copydir="/c/Windows/Temp/git_hook_compile_copy" 

echo "making copy of $newrev to $copydir" >&2 
rm -rf "$copydir" 
mkdir "$copydir" 
git archive $newrev | tar -x -C $copydir/ 
if [ "$?" != "0" ]; then 
    echo "*** unable to make copy of code" >&2 
    exit 1 
fi 
echo "attempting to build $newrev" >&2 
"$ANT_HOME/bin/ant" -file "$copydir/appropriatePath/build.xml" 
if [ "$?" != "0" ]; then 
    echo "*** code does not compile" >&2 
    exit 1 
fi 

(इस पर ध्यान दें एक विंडोज़ वातावरण के लिए है और ANT_HOME (और इस प्रकार JAVA_HOME पर निर्भर करता है) वातावरण चर परिभाषित किया जा रहा)

उत्तर

4

Git सर्वर और ग्राहक भिन्न नहीं हैं कि बहुत ;-)। तो "क्लाइंट" पर चलने वाले सभी हुक सर्वर पर समान घटनाएं होने पर "सर्वर" पर चलेंगे।

उदाहरण के लिए, update हुक, पूरी तरह से इस श्रेणी में आता है। शाखा को अद्यतन करने के बाद इसे बुलाया जाता है, और यदि यह हुक nonzero स्थिति देता है, तो अद्यतन रद्द कर दिया जाता है। तो आप वहां संकलन करना चाहते हैं, और इसके परिणाम वापस कर सकते हैं। हुक से मुद्रित सभी संदेश उस उपयोगकर्ता को दिखाए जाएंगे जो उसके कंसोल पर काम करता है। यह काफी आसान है, क्योंकि वह आपकी बिल्ड स्क्रिप्ट से त्रुटि संदेश देख सकता है, और इसे ठीक कर सकता है।

भले ही आप दो संकलनों को एक साथ चलाते हैं, फिर भी गिट रिपोजिटरी अपने अपडेट हुक में "पुराना refname" तर्क के उपयोग के कारण काम नहीं खोएगा। हालांकि, ऐसा तब हो सकता है जब एक कमिश्नर संकलन के लिए इंतजार कर रहा है, और उसका रेफ धक्का नहीं दिया जाता है क्योंकि किसी और को उसके बजाय धक्का दिया जाता है।

एक डिफ़ॉल्ट गिट भंडार में update हुक का एक अच्छा उदाहरण है (नाम update.sample)। यदि आपको एक निश्चित उदाहरण की आवश्यकता है तो इसका संदर्भ लें।

हालांकि, अगर संकलन बहुत लंबा है, और प्रतिबद्धता की दर आवृत्ति से अधिक है तो आप अपने कोड को संकलित कर सकते हैं, तो आप अधिक उन्नत समाधानों का उपयोग करना चाहेंगे। टिप्पणीकर्ता Google में "निरंतर एकीकरण" की तलाश करने का सुझाव देते हैं।

+6

प्रत्येक धक्का पर एक परियोजना संकलन निषिद्ध रूप से महंगा हो सकता है; यदि हां, तो 'निरंतर एकीकरण' Google के लिए क्या है। निरंतर एकीकरण के लिए – 9000

+0

+1। –

+0

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

1

हम डेवलपर द्वारा किए गए काम के रास्ते में gerrit रखते हुए और हर कोई क्या देखता है। दो लोगों को गलती करने में लगती है जो हर किसी के लिए सामान तोड़ती है।

हम buildbot (निरंतर एकीकरण के लिए) का भी उपयोग करते हैं ताकि हम कोड "सार्वजनिक" होने से पहले सभी मशीनों में एक बिल्ड चला सकें।

+0

+1: गेरिट के लिए। और यहां एक लाइव डेमो है: https://review.source.android.com/ –

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

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