ओह ओह, यह प्रश्न दरारों के माध्यम से फिसल गया प्रतीत होता है। आशा है कि आप अभी भी वहां हैं, एस्बेन!
आप update hook की तलाश में हैं, जो प्रत्येक रेफरी अपडेट के लिए एक बार चलाया जाता है। तर्क रेफरी का नाम है, पुराना ऑब्जेक्ट नाम (SHA1 प्रतिबद्ध करें), और नया ऑब्जेक्ट नाम।
तो, आपको बस इतना करना है कि पुराने और नए के बीच अंतर की जांच करें और सुनिश्चित करें कि यह आपके मानकों को पूरा करता है। यह बिल्कुल पूरी तरह से सरल नहीं है, लेकिन यह पूरी तरह से प्रबंधनीय है। यहां मैं क्या करूँगा:
निम्न स्क्रिप्ट को .git/hooks/update
पर सहेजें।
old=$2
new=$3
# that's a literal tab, because (ba)sh turns \t into t, not a tab
# make sure your editor doesn't expand it to spaces
git diff --name-only $old $new | egrep '(\.(cpp|h)$)|^CMakeLists.txt$' | xargs -d'\n' git diff -U0 $old $new -- | grep -q '^+.* ' && exit 1
सभी फाइलों को जो पुराने और नए, सभी वांछित लोगों के लिए greps के बीच भिन्न सूचीबद्ध करता है यही कारण है, (, संदर्भ से शून्य लाइनों के साथ के बाद से हम परवाह नहीं है) उनके लिए diff हो जाता है, और के लिए greps एक जोड़ा लाइन (+
से शुरू) जिसमें एक टैब है। Grep सफलता प्राप्त करता है अगर इसे एक पाता है, जो &&
रन exit 1
चलाएगा, जिससे हुक विफलता से बाहर निकलने और अपडेट को रद्द कर देगा!
ध्यान दें कि यह आपकी आवश्यकताओं से थोड़ा अलग है - यह जांचता है कि diff कोई टैब वर्ण जोड़ता है या नहीं। यह लंबे समय तक शायद बेहतर है; एक बार जब आप सुनिश्चित कर लें कि आपका मौजूदा कोड ठीक है, तो यह वही बात है, जो बहुत तेज़ी से छोड़कर है क्योंकि इसे सभी सामग्री को खोजना नहीं है।
क्या आप हुक लिखने में मदद मांग रहे हैं, या इस उद्देश्य के लिए एक अद्यतन हुक काम करेगा या नहीं? – Cascabel
वास्तव में दोनों :) मैं बहुत हैरान था कि यह आसानी से खोजने योग्य और डाउनलोड करने योग्य नहीं था, इसलिए मुझे लगता है कि यह गैर-तुच्छ है। इस तरह का एक हुक कैसे दिख सकता है इसका एक उदाहरण बहुत मदद करेगा। –