2010-05-14 9 views
5

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

मैं इस प्रतिबंधित करना चाहते हैं ... मैं एक घंटे के लिए या तो आज डॉक्स पर डाला और में बनाया गया कुछ भी नहीं कर सकता है।

किसी को भी किसी भी समाधान है?

+5

अपने डेवलपर्स को और सावधान रहने के लिए कहें? टूलिंग हमेशा समाधान नहीं है। –

+2

गिट रेपो कुछ रंग दें, और अपने डेवलपर्स को "गिट एड" के बारे में सिखाएं। "गिट स्टेटस" और "गिट एड-ए" –

उत्तर

5

आप pre-push हुक (Git 1.8.2 के बाद से) का उपयोग कर सकते हैं।

आपका पूर्व धक्का हुक git status के निकास कोड की जांच कर सकता है, अगर git status रिटर्न गैर शून्य (पुश करने के लिए ठीक है) लौटने 0 अन्यथा 1 लौटने (पुश की अनुमति नहीं है)।

git-status के लिए आदमी पृष्ठ बताता है:

अगर कोई रास्ता है कि इंडेक्स फ़ाइल और वर्तमान प्रधान के लिए प्रतिबद्ध के बीच अलग है, आदेश बाहर निकलता है (यानी, वहाँ Git चल प्रतिबद्ध द्वारा प्रतिबद्ध करने के लिए कुछ भी नहीं है) गैर-शून्य स्थिति के साथ।

गिट 1.8.2 या बाद में निर्मित कोई भी रेपो निर्देशिका में pre-push.sample होगा, जो आपकी नीति को लागू करने के लिए एक उपयोगी प्रारंभिक बिंदु है। pre-push हुक का उपयोग करने के अधिक अच्छे उदाहरण यहां दिए गए हैं: http://blog.ittybittyapps.com/blog/2013/09/03/git-pre-push/

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

+0

क्या यह 'प्री-पुश' हुक नहीं है? – Glyph

+0

@ ग्लाइफ - धन्यवाद! गिट 1.8.2 में 'प्री-पुश' जोड़ा गया था, इसलिए मेरा जवाब पुराना है। रुचि रखने वाले किसी के लिए, यहां कुछ अच्छी जानकारी दी गई है: http://blog.ittybittyapps.com/blog/2013/09/03/git-pre-push/ –

0

आप उपयोग कर सकते हैं various hooks (पूर्व प्राप्त करते हैं, मेरा मानना ​​है कि) निर्धारित करने के लिए धक्का निर्माण तोड़ने के लिए और यह अस्वीकार कर देंगे। इसके अलावा, आप git status चलाने के लिए अपने डेवलपर्स बता किसी भी प्रतिबद्ध या ऑपरेशन है, जो एक अविश्वसनीय रूप से समझदार नियम जगह में है और इस तरह की समस्याओं से निबटने होता है धक्का से पहले करना चाहिए।

0

स्वचालित रूप से परिवर्तन जोड़ने के लिए, आप -a ध्वज का उपयोग पर विचार करना चाह सकते हैं। git-commit man page से:

आदेश के लिए स्वचालित रूप चरण फ़ाइलों को संशोधित किया गया है और नष्ट कर दिया, लेकिन नई फ़ाइलें आप है नहीं के बारे में प्रभावित नहीं हैं Git बताया बताओ।

git commit के लिए कोई झंडे प्रतीत नहीं होता है जो अनचाहे फ़ाइलों को जोड़ता है। प्रतिबद्धता से पहले git add . करने के लिए याद रखना सबसे अच्छा समाधान है जिसे मैं सोच सकता हूं।

+0

याद रखें कि "गिट एड"। केवल उन फ़ाइलों को जोड़ता है जो कमांड पर हैं या कमांड पर हैं –

0

शायद आपके शेल या गिट कॉन्फ़िगरेशन में एक उपनाम डालें, जो एक कस्टम स्क्रिप्ट के साथ डिफ़ॉल्ट पुश कमांड को प्रतिस्थापित करता है जो पहले गिट स्थिति करता है और "कार्यशील निर्देशिका साफ़" के लिए जांच करता है? मुझे नहीं पता कि ओवरराइटिंग पुश संभव है, या अगर ऐसा होता है तो आप असली धक्का नहीं कह सकते हैं। मेरे सिर के ऊपर से सिर्फ एक विचार है, इसलिए मुझे कोई जानकारी नहीं है कि यह वास्तव में काम करता है या नहीं।

+0

आप अंतर्निहित कमांड को ओवरराइड करने के लिए उपनाम का उपयोग नहीं कर सकते । एक शेल उपनाम में कोई स्थान नहीं हो सकता है, इसलिए आप अपने स्वयं के आदेश लिखने के लिए बहुत अधिक वापस आ गए हैं। – Cascabel

0

मैं हमारे मुख्य रेपो के लिए जोर दे रहा से पहले अपने स्थानीय निर्माण करने के लिए एक चींटी का लक्ष्य जोड़ने ... यहाँ लक्ष्य है समाप्त हो गया ...अगर कोई और सही दिशा में एक कदम की तलाश में था।

उत्तर देने वाले सभी के लिए धन्यवाद।

<target name="git-status-check"> 
    <echo>Performing git working directory check for local modifications or untracked files.</echo> 
    <exec executable="git" failifexecutionfails="true" 
     outputproperty="git.check"> 
     <arg value="status"/> 
    </exec> 
    <echo>${git.check}</echo> 
    <propertyregex property="dirty.working.dir" input="${git.check}" regexp="working directory clean" 
     select="\1" casesensitive="false" /> 
    <fail message="Git status reports that you have local modifications or untracked changes in your working dir... did you forget to commit these changes? ${line.separator} "> 
     <condition> 
      <not> 
       <isset property="dirty.working.dir" /> 
      </not> 
     </condition> 
    </fail> 
    <echo>Git status reported a clean working dir continuing build...</echo> 
</target> 
+0

क्या मेरे उत्तर ने आपको आपके प्रश्न का उत्तर देने में मदद की? –

+0

आपको मैट के जवाब को स्वीकार करना चाहिए ... यह विशेष रूप से प्रश्न पर विचार करने में सहायक नहीं है (Google और मैट की टिप्पणी से आया था अविश्वसनीय रूप से सहायक) –

+0

मैंने किया ... 6 साल पहले – Clintm

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

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