2011-04-28 13 views
17

इसलिए मेरी शाखा का नाम बगट्रैकर टिकट नंबर के नाम पर रखा गया है, "मुद्दा -1234" जैसा कुछ है, और हमारे पास प्रतिबद्ध संदेश में हमेशा टिकट नंबर लिखने का एक सम्मेलन है। मैं सोच रहा हूं कि जब मैं किसी मुद्दे पर काम कर रहा हूं- * शाखा बिना स्पष्ट रूप से लिखने के लिए स्वचालित रूप से प्रतिबद्ध संदेश में टिकट संख्या को जोड़ना संभव है।गिट प्रतिबद्ध हुक का उपयोग कर टिकट नंबर संलग्न करें?

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

दोहराना करने के लिए, मैं सोच रहा हूँ अगर यह संभव है:

शाखा पर:

: मुद्दा-1234

git commit -a -m"fixed this pesky issue" 

प्रतिबद्ध है, Git लॉग में, यह के रूप में संदेश से पता चलता बाद

fixed this pesky issue. ticket number: #1234 

उत्तर

16

आप एक हुक चूक गए। जो आप चाहते हैं वह commit-msg:

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

उदाहरण के लिए

तो:

#!/bin/sh 

ticket=$(git symbolic-ref HEAD | awk -F- '/^issue-/ {print $2}') 
if [ -n "$ticket" ]; then 
    echo "ticket #$ticket" >> $1 
fi 

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

बेशक, मैं वास्तव में prepare-commit-msg में ऐसा करने की सिफारिश करता हूं, और git commit (-m के बिना) के साथ काम करता हूं। यह बहुत दुर्लभ है कि आप वास्तव में एकल-पंक्ति प्रतिबद्ध संदेश में पर्याप्त जानकारी लिख सकते हैं। इसके अलावा, यह प्रतिबद्धता से पहले आपको संदेश देखने देगा, अगर आपका हुक जो कुछ भी आप चाहते हैं वह नहीं करता है।

+0

+1 सरल और काम करता है। जिस तरह से यह होना चाहिए :) – ralphtheninja

+0

+1। यदि आप किसी फ़ाइल में अपनी बहु-पंक्ति टिप्पणी को रीडायरेक्ट करते हैं, तो एक 'गिट प्रतिबद्ध - फ़ाइल = myMultiLineCommentFile' करें, फिर भी आप 'commit-msg'hook' का उपयोग कर सकते हैं, है ना? – VonC

+0

@VonC: जब भी प्रतिबद्धता की जाती है तो 'प्रतिबद्ध-msg' हुक आग लगती है - पूरी तरह से स्वचालित विलय के अपवाद के साथ (यानी कोई विरोध नहीं, कोई' --no-commit')। ओपी के लिए यह कोई मुद्दा नहीं होना चाहिए, हालांकि। (यह वास्तव में एक बग/निरीक्षण का थोड़ा सा है, वास्तव में। हाल ही में उन्होंने स्वचालित विलय के लिए 'तैयार-प्रतिबद्ध-संदेश' हुक के लिए समर्थन जोड़ा, लेकिन मेरा मानना ​​है कि 'पोस्ट-प्रतिबद्ध' और 'प्रतिबद्ध-msg' अभी भी गायब हैं।) – Cascabel

2

एक और विकल्प git notes का उपयोग करना होगा, जो आपके द्वारा उल्लेख किए गए हुकों में से एक का उपयोग करके, प्रतिबद्धता के लिए टिकट संख्या जानकारी जोड़ने के लिए होगा।
("Notes to self" नोट्स तंत्र पर अधिक के लिए ब्लॉग पोस्ट एंट्री देखें)

+0

हुक के साथ समस्या यह है कि यह वास्तव में काम नहीं करता है अगर मैं पहले ही एमएम के साथ प्रतिबद्ध संदेश प्रदान करता हूं। तैयारी-संदेश-संदेश हुक केवल तभी काम करता है जब बाहरी संपादक को – EnToutCas

+0

@EnToutCas निकाल दिया जाता है: आपका मतलब है कि प्रतिबद्धता संदेश '-m' के माध्यम से निर्दिष्ट किए जाने पर आपके पास किसी प्रतिबद्धता पर स्वयं को निष्पादित करने पर कोई हुक नहीं है? VonC के लिए – VonC

+0

+1 भी। यह हर दिन नए ज्ञान में स्नान करने में सक्षम होने के लिए एक अच्छी भावना है। स्टैक ओवरफ्लो चट्टानों और यह स्टैक ओवरफ्लो के लोग हैं जो इसे बनाते हैं। – ralphtheninja

4

आप prepare-commit-msg हुक का भी उपयोग कर सकते हैं, जो commit-msg से अधिक पैरामीटर स्वीकार करता है। फिर आप यह जांच सकते हैं कि संदेश जब आप इसे नहीं चाहते हैं तो समस्या संख्याओं को जोड़ने से बचने के लिए फ़ाइल, टेम्पलेट इत्यादि से आ रहा है या नहीं।

.git/hooks/prepare-commit-msg में निम्न स्क्रिप्ट जब आप foo-123 नामक एक सुविधा शाखा में काम कर रहे हैं के साथ

, तो [#123] हर प्रतिबद्ध आप कर की तीसरी पंक्ति में जोड़ दिया जाएगा।

More information in this post I wrote

#!/bin/sh 

if [ x = x${2} ]; then 
    BRANCH_NAME=$(git symbolic-ref --short HEAD) 
    STORY_NUMBER=$(echo $BRANCH_NAME | sed -n 's/.*-\([0-9]\)/\1/p') 
    if [ x != x${STORY_NUMBER} ]; then 
    sed -i.back "1s/^/\n\n[#$STORY_NUMBER]/" "$1" 
    fi 
fi 
2

इस तरह से आप संदेश के लिए प्रतिबद्ध के शुरू करने के शाखा का नाम जोड़ सकते हैं। यह तैयारी-प्रतिबद्ध-संदेश हुक है। "गिट प्रतिबद्ध-एम" और "गिट प्रतिबद्ध" आदेश दोनों के लिए काम करें। विकल्प फ़ाइल है। Git/hooks/pre-commit।छोड़ें जिसमें शाखाओं की एक सूची है जो आप स्वतः प्रीपेड नहीं करना चाहते हैं।

BRANCH="$(git rev-parse --abbrev-ref HEAD)" 
FILE_CONTENT="$(cat $1)" 
skip_list=`git rev-parse --git-dir`"/hooks/pre-commit.skip" 
if grep -E "^$BRANCH$" $skip_list; then 
    exit 
fi 
if [ $2 = "message" ]; then 
    echo $BRANCH: $FILE_CONTENT > $1 
else 
    echo $BRANCH: > $1 
    echo $FILE_CONTENT >> $1 
fi 
संबंधित मुद्दे