2014-11-17 5 views
31

के लिए गिट रन खोल कमांड मैं कई प्रकार के कामों के माध्यम से चलना चाहता हूं और प्रत्येक पर शेल कमांड करना चाहता हूं। अगर आदेश विफल रहता है, तो मैं चलना चाहता हूं, अन्यथा चलते रहें। मैंने filter-branch पर देखा है, लेकिन मैं काम को दोबारा लिखना नहीं चाहता हूं, बस उन्हें जांचें। for-each-ref आपको कार्य करने के लिए एक सीमा निर्दिष्ट करने की अनुमति नहीं देता है।प्रत्येक प्रतिबद्धता

मेरी विशिष्ट समस्या यह है कि मैंने कामों का एक गुच्छा बनाया और मैं यह सुनिश्चित करना चाहता हूं कि प्रत्येक प्रतिबद्धता निर्माण योग्य हो। मैं कुछ ऐसा करना चाहते हैं:

git foreach origin/master..master 'git submodule update && make clean && make' 

मैं निश्चित रूप से ऐसा करने के लिए एक खोल स्क्रिप्ट लिख सकता है, लेकिन यह बात Git करने के लिए एक अच्छा तरीका हो सकता है की तरह की तरह लगता है।

+0

क्या आपने पाइथन का उपयोग करने पर विचार किया है? शायद गिटपीथन एक समाधान हो सकता है। इस पोस्ट को जांचें: http://stackoverflow.com/questions/1456269/python-git-module-experiences – kmundnic

+0

क्या आप जानते हैं कि मूल/मास्टर अच्छा है और मास्टर खराब है (या उलटा), या आप बस परीक्षण करने की कोशिश कर रहे हैं बिना किसी विशिष्ट स्थान पर विफलता मौजूद है, यह जानने के बिना उनके बीच सब कुछ? –

+0

@ चार्ल्सडफी, उत्तरार्द्ध। मैंने एक कामकाजी बिंदु से शुरू किया और काम करने वाले बदलावों का एक गुच्छा बना दिया। तब मैंने असामान्य कामकाजी परिवर्तनों के ढेर से कई सुगंधित काम किए, और यह सुनिश्चित करना चाहते हैं कि बीच में सभी कामकाज योग्य हैं। स्ट्रिंग-स्प्लिटिंग और ग्लोब विस्तार से बचने के लिए – FazJaxton

उत्तर

38

के साथ उपयोग करें आप एक कार्यकारी विकल्प के साथ इंटरैक्टिव रिबेस उपयोग कर सकते हैं कर सकते हैं।

git rebase -i --exec <build command> <first sha you want to test>~ 

बनाने के लिए एक अंतिम इतिहास में प्रतिबद्ध प्रत्येक पंक्ति के बाद संलग्न --exec "कार्यकारी"। एक या अधिक खोल आदेशों के रूप में व्याख्या किया जाएगा।

रीडरिंग और संपादन करना आमतौर पर अनचाहे इंटरमीडिएट चरणों का निर्माण करता है। आप यह जांचना चाहेंगे कि आपका इतिहास संपादन किसी भी परीक्षण को चलाकर, या कम से कम "exec" कमांड (शॉर्टकट "x") का उपयोग कर इतिहास में इंटरमीडिएट बिंदुओं पर पुन: संकलित नहीं कर सकता है।

एक कमांड विफल होने पर इंटरैक्टिव रीबेस बंद हो जाएगा (यानी गैर-0 स्थिति के साथ बाहर निकलता है) ताकि आपको समस्या को ठीक करने का मौका दिया जा सके।

+0

गिट का संस्करण मैं 1.7 के साथ अटक गया हूँ।10 में --exec कमांड लाइन विकल्प नहीं है, इसलिए मैंने प्रत्येक पिक कमांड के बाद मैन्युअल रूप से "एक्स मेक" डाला और यह एक इलाज किया। धन्यवाद। –

+0

यदि अतिरिक्त छूट में विलय में विलय शामिल है, तो आपको अतिरिक्त विकल्प '-p' और '--preserve-merges' की आवश्यकता हो सकती है। – Unapiedra

+0

अंत में ~ अंत में क्या अच्छा है? –

16

शायद आप rev-list चाहते हैं।

#!/usr/bin/env bash 
# test_commits.sh 

while read -r rev; do 
    git checkout "$rev" 
    if ! git submodule update && make clean && make; then 
     >&2 echo "Commit $rev failed" 
     exit 1 
    fi 
done < <(git rev-list "$1") 

तो फिर तुम

./test_commits.sh origin/master..master 
+4

अधिक उद्धरणों की आवश्यकता है। '" $ 1 "', '" $ rev "', आदि। स्ट्रिंग-स्प्लिटिंग से पहले 'गिट रेव-लिस्ट' से सभी आउटपुट एकत्रित करना और उन्हें फिर से शुरू करना 'रीड-आर rev के दौरान' कर ...; किया <<(गिट रेव-लिस्ट "$ 1") ', जो सामग्री को स्ट्रीम करता है क्योंकि वे पूरी स्ट्रीम एकत्र करने और इसे आगे की ओर खींचने के बजाए पढ़े जाते हैं। (स्पष्ट कारणों से, यह दृष्टिकोण बहुत बड़ी संशोधन सूचियों के साथ और अधिक स्मृति-कुशल है)। –

+2

(उस ने कहा, जबकि शैल बेस्ट प्रैक्टिस के आसपास सुधार के लिए जगह है, यह बिल्कुल बिल्कुल सही जवाब है, और मेरा +1 है)। –

+0

@ चार्ल्सडफी - मुझे किसी सूची की सामग्री में स्ट्रीमिंग के इस तरीके के बारे में कभी नहीं पता था क्योंकि वे पढ़ रहे हैं - धन्यवाद! –

1

xargs का उपयोग करके एक अच्छा एक-लाइनर यहां है।

git rev-list @{upstream}..HEAD | xargs -n1 -I{} sh -c 'git checkout {} && git submodule update && make clean && make' 
+0

इस बात पर निर्भर करता है कि आप कितनी दूर जाना चाहते हैं, इससे पहले कि आप ट्रैश किए गए रीफ्लॉग को नहीं चाहते हैं, तो इससे पहले '.git/logs/HEAD' का बैकअप बनाना अच्छा होगा। – CDanU

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