प्रकाशित कमिट के संपादन को ब्लॉक करने के लिए गिट में हुक का उपयोग करना

हेलो, हेब्र!

जो लोग Git के साथ काम करते हैं वे git commit --amend साथ अंतिम कमिट को संपादित करने के तरीके से परिचित हैं। यह मामूली संपादन के लिए सुविधाजनक है (कमेंट में टिप्पणी बदलें, कोड में लाइन को ठीक करें, आदि), क्योंकि अक्सर इस प्रतिबद्ध के बाद प्रतिबद्ध के बारे में अच्छे विचार दिमाग में आते हैं।

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

जब - theamend विकल्प के साथ कमिट किया जाता है, तो एक नई कमिट बनाई जाती है (एक नए हैश के साथ), जो पिछले एक को बदल देती है, और वह पिछली कमिट हिस्ट्री से डिलीट हो जाती है।

यदि आप अपनी पहले से प्रकाशित प्रतिबद्ध ( git push कमांड द्वारा दूरस्थ रिपॉजिटरी को भेजे गए) को संपादित करते हैं, तो भविष्य में अपने लिए समस्याएं खड़ी करें (जब आप अपनी संपादित प्रतिबद्ध प्रकाशित करने का प्रयास करें) और ( सबसे महत्वपूर्ण! ) उन अन्य डेवलपर्स के लिए समस्याएँ खड़ी करें जो अपने स्थानीय रिपॉजिटरी प्राप्त करने में कामयाब रहे ! पुराना वचन। इस स्थिति में, आप और अन्य डेवलपर्स को स्थिति को ठीक करने के लिए प्रतिबद्ध इतिहास को साफ करने में सिरदर्द प्रदान किया जाता है।

अधिकांश सिफारिशें सलाह के लिए नीचे आती हैं : प्रकाशित कमिट्स को पूरा न करें!

और सब कुछ बहुत अच्छा होगा अगर git commit --amend इतना अच्छा और सुविधाजनक नहीं था! मैं दूरस्थ रिपॉजिटरी में कमिट्स के इतिहास को देखे बिना इसका उपयोग करना चाहता हूं। इसलिए, मुझे इस तरह के चेक को स्वचालित करने की इच्छा थी।

गिट सिस्टम हुक में ऐसे स्वचालन के लिए, जो कि क्लाइंट की तरफ काम करते हैं, उत्कृष्ट रूप से काम करेंगे। वे सेवा निर्देशिका .git/hooks में संग्रहीत हैं और पूर्वनिर्धारित नामों के साथ स्क्रिप्ट फ़ाइलें हैं जो उनके कार्यात्मक उद्देश्य के अनुरूप हैं। मेरे कार्य के लिए, संदेश- तैयार-संदेश-प्रतिबद्ध के लिए एक संदेश बनाने वाला इंटरसेप्टर उपयुक्त है।

विचार का सार यह है:
  1. हम git commit --amend इंटरसेप्ट करते हैं;
  2. हमें स्थानीय शाखा में अंतिम प्रतिबद्ध का हैश मान मिलता है;
  3. हमें दूरस्थ शाखा में अंतिम प्रतिबद्ध का हैश मान मिलता है;
  4. हम उनकी तुलना करते हैं, और यदि वे समान हैं, तो हम एक चेतावनी प्रदर्शित करते हैं और प्रतिबद्ध संदेश की सामग्री पर टिप्पणी करते हैं - ताकि जब आप संपादन से बाहर निकलते हैं, तो खाली संदेश ("खाली प्रतिबद्ध संदेश के कारण गर्भपात करना") के कारण प्रतिबद्ध रद्द हो जाता है।

सामग्री तैयार-प्रतिबद्ध-संदेश

 #!/bin/bash case "$2,$3" in commit,HEAD) #  short SHA-1      sha1_local=$(git branch -vv | \ perl -lne 'print "$1" if /\*{1}\s+\S+\s+(\w+)\s+\[(\S+)\/(\S+).*\]\s+.*/') #     (remote branch) remote_branch=$(git branch -vv | \ perl -lne 'print "$1/$2" if /\*{1}\s+\S+\s+\w+\s+\[(\S+)\/(\S+).*\]\s+.*/') #  short SHA-1      (remote branch) sha1_remote=$(git branch -rv | \ awk -v branch=$remote_branch '{ if ($1 == branch) print $2 }') if [ -n "$sha1_local" ] && [ -n "$sha1_remote" ] && [ "$sha1_local" = "$sha1_remote" ] then #   ,      #    -   ci_comment=$(cat "$1" | grep -v '#' | perl -lne 'print "# $_"') ci_autogen=$(cat "$1" | grep '#') echo -e "$ci_comment" > "$1" #    echo -e "# !      !\n" >> "$1" echo -e "$ci_autogen" >> "$1" fi ;; *) ;; esac 

इस हुक के संचालन का एक उदाहरण नीचे दिया गया है:



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

Source: https://habr.com/ru/post/In221819/


All Articles