2011-11-14 9 views
48

मुझे लगता है कि एक git commit करता है एक कपड़े स्क्रिप्ट लिखने की कोशिश कर रहा हूँ; हालांकि, अगर प्रतिबद्ध करने के लिए कुछ भी नहीं है, तो 1 की स्थिति के साथ गिट निकलता है। तैनाती स्क्रिप्ट उस असफल के रूप में ले जाती है, और छोड़ती है। मैं वास्तविक विफलताओं करने वाली प्रतिबद्ध पता लगाने के लिए चाहते हैं, तो मैं बस कपड़े एक कंबल git commit असफलताओं के लिए नजरअंदाज नहीं दे सकते हैं। मैं रिक्त-प्रतिबद्ध विफलताओं को अनदेखा करने की अनुमति कैसे दे सकता हूं ताकि तैनाती जारी रहे, लेकिन असली प्रतिबद्धता विफल होने पर भी त्रुटियों को पकड़ें?बिना किसी त्रुटि के कुछ भी गिटेट करने के लिए कैसे?

def commit(): 
    local("git add -p && git commit") 

उत्तर

69

पकड़ने Git diff के निकास कोड की जाँच करके इस हालत पहले से?

उदाहरण (शेल में) के लिए:

git add -A 
git diff-index --quiet HEAD || git commit -m 'bla' 

संपादित करें: फिक्स्ड git diff होल्गर की टिप्पणी के अनुसार आदेश।

+47

ध्यान दें कि 'गिट diff' एक "पोर्सिलीन" कमांड है जिसे स्क्रिप्टिंग के लिए उपयोग नहीं किया जाना चाहिए। आप जो चाहते हैं वह 'गिट डिफ-इंडेक्स --क्वेट हेड || है गिट प्रतिबद्ध-एम 'ब्लै'। यह भी देखें [यह उत्तर] (http://stackoverflow.com/a/2659808/659002)। – Holger

+0

चीजों को और समझाने के लिए, 'गिट diff --quiet --exit-code --cached' के साथ समस्या यह है कि यह केवल संशोधित फ़ाइलों के लिए '1' (झूठी) का मूल्यांकन करेगा जो प्रतिबद्ध नहीं हैं (अवांछित फ़ाइलें)। अप-वोट की गई टिप्पणी नई फाइलों और हटाने के लिए खाते का सबसे अच्छा समाधान है। –

+0

'गिट diff-index --quiet HEAD के बारे में टिप्पणी || गिट प्रतिबद्ध-एम 'ब्लै' इस प्रश्न में एक जवाब होना चाहिए। –

41

git commit आदमी पृष्ठ से:

--allow-empty 
    Usually recording a commit that has the exact same tree as its 
    sole parent commit is a mistake, and the command prevents you 
    from making such a commit. This option bypassesthe safety, and 
    is primarily for use by foreign SCM interface scripts. 
+26

हालांकि यह वास्तव में एक प्रतिबद्धता बनाएगा। – ThiefMaster

+5

@ थिफमास्टर: ठीक है। मैं ओपी से नहीं कह सकता कि यह एक समस्या है या नहीं। मुझे लगता है कि यदि आप स्वचालित प्रतिबद्धताओं का उपयोग कर रहे हैं, तो आपको अपने इतिहास को वैसे भी साफ करने की परवाह नहीं है। –

+1

अगर मैं इससे बचा जा सकता हूं तो मैं इसे प्रतिबद्ध नहीं करना चाहूंगा। क्या ऐसा करने के लिए कोई रास्ता है? – kojiro

6
with settings(warn_only=True): 
    run('git commit ...') 

इस विफलता की अनदेखी करने के कपड़े का कारण बनता है। खाली काम नहीं करने का लाभ है।

आप with hide('warnings'): की एक अतिरिक्त परत पूरी तरह से उत्पादन को दबाने के लिए में लपेट कर सकते हैं, अन्यथा आप कपड़े उत्पादन कि विफल करने में एक नोट मिल जाएगा (लेकिन fabfile निष्पादित करने के लिए जारी है)।

+0

ओपी लिखा था" मैं * वास्तविक * विफलताओं करने वाली प्रतिबद्ध पता लगाने के लिए चाहते हैं "चूक; यह कोड * सभी * विफलताओं को करने के लिए छिपाएगा। – bfontaine

-3

ट्राई/कैच बच्चे!

from fabric.api import local 
from fabric.colors import green 


def commit(message='updates'): 
    try: 
     local('git add .') 
     local('git commit -m "' + message + '"') 
     local('git push') 
     print(green('Committed and pushed to git.', bold=False)) 
    except: 
     print(green('Done committing, likely nothing new to commit.', bold=False)) 
+6

यह समझाने के लिए कि आप डाउनवॉटेड क्यों हैं: अन्य त्रुटियां भी हो सकती हैं जिन्हें आप पकड़ना चाहते हैं। आप यह नहीं मानना ​​चाहते कि किसी त्रुटि के मामले में, ऐसा हो सकता है कि कुछ भी नहीं किया जाना चाहिए।- इसके अलावा, लेकिन यह असंबंधित है: किसी भी सामान्य 'को छोड़कर' का उपयोग न करें: ', अपवाद को छोड़कर' या तो इसके बजाय उपयोग करें। – Albert

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