कैसे एक त्रुटि के बिना कुछ करने के लिए प्रतिबद्ध है?


92

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

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

जवाबों:


157

इस स्थिति को पहले से पकड़ कर बाहर निकलें git diff के कोड की जाँच करें?

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

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

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


64
ध्यान दें कि git diffएक "चीनी मिट्टी के बरतन" कमांड है जिसका उपयोग स्क्रिप्टिंग के लिए नहीं किया जाना चाहिए। क्या आप सबसे अधिक संभावना चाहते हैं git diff-index --quiet HEAD || git commit -m 'bla'इस उत्तर को भी देखें ।
होल्गर

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

2
git diff-index --quiet HEAD || git commit -m 'bla'इस प्रश्न के बारे में टिप्पणी का जवाब होना चाहिए।
रकीब

1
चूँकि टोबी ने होल्गर की टिप्पणी के अनुसार अपने उत्तर को ठीक करने की परवाह नहीं की, इसलिए मैंने उसका उत्तर स्वयं संपादित किया।
वोग

ध्यान दें कि git diff-index --quiet HEAD परीक्षण नहीं करता है यदि स्थानीय रिपॉजिटरी मूल के साथ अद्यतित है।
bortzmeyer

62

से 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.

43
यह वास्तव में एक कमिट बनाएगा।
ThiefMaster

6
@ThiefMaster: सही है। मैं ओपी से नहीं कह सकता कि यह कोई समस्या है या नहीं। मुझे लगता है कि यदि आप स्वत: आवागमन का उपयोग कर रहे हैं, तो आप वैसे भी अपने इतिहास के स्वच्छ रहने की परवाह नहीं करते हैं।
स्वेन मार्नाच

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

3
इस सवाल का जवाब नहीं है
मनोज् यों

7
@manojisions: "बेशक ओपी एक खाली प्रतिबद्धता नहीं बनाना चाहता।" मैंने आज अपने क्रिस्टल बॉल को घर पर छोड़ दिया, इसलिए मुझे पता नहीं था। -pहालांकि, याद किया , लेकिन फिर भी
स्वेन मार्नाच

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

यह कपड़े की विफलता का कारण बनता है। खाली आवागमन नहीं बनाने का फायदा है।

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


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

-2

कोशिश करो / बच्चे को पकड़ो!

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))

10
यह समझाने के लिए कि आप क्यों कम हो गए हैं: अन्य त्रुटियां हो सकती हैं जिन्हें आप पकड़ना चाहते हैं। आप केवल यह नहीं मानना ​​चाहते हैं कि त्रुटि के मामले में, यह हो सकता है कि कुछ भी प्रतिबद्ध नहीं होना चाहिए। - इसके अलावा, लेकिन यह असंबंधित है: इसके बजाय कभी भी जेनेरिक except:, उपयोग except Exceptionया उपयोग न करें ।
अल्बर्ट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.