स्क्रिप्ट लिखते समय आपको git ब्रांच का उपयोग नहीं करना चाहिए । Git एक "प्लंबिंग" इंटरफ़ेस प्रदान करता है जो स्पष्ट रूप से स्क्रिप्टिंग में उपयोग के लिए डिज़ाइन किया गया है (सामान्य Git कमांड के कई वर्तमान और ऐतिहासिक कार्यान्वयन (ऐड, चेकआउट, मर्ज, आदि) इसी इंटरफ़ेस का उपयोग करते हैं)।
आप जो प्लंबिंग कमांड चाहते हैं वह प्रत्येक के लिए git है :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
नोट: आपको remotes/
दूरस्थ रेफरी पर उपसर्ग की आवश्यकता नहीं है जब तक कि आपके पास अन्य रेफ्स न origin/master
हों जो रेफ नाम खोज पथ में कई स्थानों से मेल खाते हैं (देखें "ए प्रतीकात्मक रेफरी नाम ...") गिट-रेव-पार्स के निर्दिष्ट संशोधन अनुभाग में। (१) )। आप explictly अस्पष्टता से बचने की कोशिश कर रहे हैं, तो पूर्ण रेफरी नाम के साथ जाना: refs/remotes/origin/master
।
आपको इस तरह आउटपुट मिलेगा:
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
आप इस आउटपुट को sh में पाइप कर सकते हैं ।
यदि आपको शेल कोड बनाने का विचार पसंद नहीं है, तो आप थोड़ी मजबूती * छोड़ सकते हैं और यह कर सकते हैं:
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* रेफरी नाम शेल के शब्द विभाजन से सुरक्षित होना चाहिए (देखें git-check-ref-format-(1) )। व्यक्तिगत रूप से मैं पूर्व संस्करण (जनरेट किए गए शेल कोड) के साथ चिपका रहूंगा; मुझे अधिक विश्वास है कि इसके साथ कुछ भी अनुचित नहीं हो सकता है।
चूंकि आपने बैश निर्दिष्ट किया है और यह सरणियों का समर्थन करता है, इसलिए आप सुरक्षा बनाए रख सकते हैं और फिर भी अपने पाश की हिम्मत पैदा करने से बच सकते हैं:
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
आप के साथ इसी तरह कुछ कर सकते हैं $@
, तो आपको लगता है कि समर्थन करता है सरणियों (एक खोल उपयोग नहीं कर रहे set --
प्रारंभ करने और set -- "$@" %(refname)
तत्वों को जोड़ने के लिए)।