एकल-अनुरक्षक PR-मर्ज समारोह
कब अनुरक्षक अपना पुल रिक्वेस्ट सीधे मर्ज कर सकता है, और उस ब्रांच प्रोटेक्शन के लिए समारोह जो एक अनुमोदन की माँग करता है और उसे व्यवस्थापकों पर भी लागू करता है।
परियोजना के ब्रांच प्रोटेक्शन के अंतर्गत PR को स्वयं मर्ज करने का कैनोनिकल संदर्भ।
mainपर लाइव प्रोटेक्शन 0 अनुमोदक समीक्षाओं की माँग करता है औरenforce_adminsको बंद रखता है, जैसा कि ब्रांच सुरक्षा पृष्ठ पर दर्ज है। इसलिए अनुरक्षक अपना पुल रिक्वेस्ट सीधे मर्ज करता है। इस पृष्ठ पर दिया गया अस्थायी-टॉगल समारोह केवल तब लागू होता है जब प्रोटेक्शन एक अनुमोदन की माँग करता है और उसे व्यवस्थापकों पर भी लागू करता है।
1. गतिरोध
लाइव main प्रोटेक्शन में ये सेटिंग्स हैं:
required_pull_request_reviews.required_approving_review_count: 0enforce_admins: false
इन सेटिंग्स के अंतर्गत कोई गतिरोध नहीं है। अनुरक्षक का पुल रिक्वेस्ट gh pr merge <pr-number> --squash --delete-branch से तब मर्ज होता है जब उसके आवश्यक स्टेटस चेक हरे हों और उसकी समीक्षा वार्तालाप हल हो चुकी हों।
गतिरोध केवल तब होता है जब प्रोटेक्शन में ये दोनों अधिक कड़ी सेटिंग्स हों:
required_pull_request_reviews.required_approving_review_count: 1enforce_admins: true
ये नियम कई-अनुरक्षक परिदृश्यों के लिए सही हैं (प्रत्येक परिवर्तन किसी सहकर्मी-समीक्षित PR के माध्यम से main तक पहुँचता है; व्यवस्थापकों को छूट नहीं है)। ये एकल अनुरक्षकों के लिए गतिरोध उत्पन्न करते हैं: GitHub की नीति आपके द्वारा लिखे गए PR पर स्व-अनुमोदन की अनुमति नहीं देती, और enforce_admins=true समीक्षा-अनुमोदन आवश्यकता के gh pr merge --admin ओवरराइड को अवरुद्ध कर देता है। enforce_admins: false होने पर, --admin अनुमोदन आवश्यकता को बायपास करता है और किसी टॉगल की ज़रूरत नहीं होती, लेकिन यह लाल आवश्यक चेक को भी बायपास करता है, इसलिए इसका उपयोग करने से पहले पुष्टि करें कि वे हरे हैं।
समाधान के तीन मार्ग हैं:
| मार्ग | कब उपयोग करें |
|---|---|
required_approving_review_count: 0 को स्थायी रूप से सेट करें (लाइव सेटिंग) | केवल तभी अपनाएँ जब रिपॉज़िटरी अनिश्चित काल तक एकल-अनुरक्षक बनी रहेगी; यह प्रोटेक्शन के समीक्षा अभिप्राय को उलट देता है |
| अस्थायी-टॉगल समारोह | एकल-अनुरक्षक स्व-मर्ज, जब प्रोटेक्शन enforce_admins=true के साथ एक अनुमोदन की माँग करता है; मर्ज विंडो के बाहर प्रोटेक्शन अपरिवर्तनीय को बनाए रखता है |
| लिखने की पहुँच वाली CI-बॉट पहचान प्रावधानित करें | केवल तभी अपनाएँ जब कई-अनुरक्षक ऑनबोर्डिंग निकट हो; बॉट-अनुमोदन प्रोटेक्शन के मानवीय-समीक्षा अभिप्राय को कमज़ोर करता है |
यह रिपॉज़िटरी वर्तमान में स्थायी शून्य-अनुमोदन मार्ग का उपयोग करती है। जब भी प्रोटेक्शन एक अनुमोदन की माँग करता है और उसे व्यवस्थापकों पर भी लागू करता है, तब अस्थायी-टॉगल समारोह कैनोनिकल मार्ग है।
2. अस्थायी-टॉगल समारोह
समारोह का अपरिवर्तनीय: समारोह के आरंभ में प्रोटेक्शन अवस्था, अंत में प्रोटेक्शन अवस्था के बराबर होती है। शिथिलता केवल मर्ज विंडो के भीतर रहती है।
मैनुअल रूप:
# 1. Open the PR, push branch, wait for CI green.
gh pr create --base main --head <feature-branch> --title "..." --body "..."
gh pr checks <pr-number> # poll until all green
# 2. Relax approver-count to 0.
gh api repos/<owner>/<repo>/branches/main/protection/required_pull_request_reviews \
-X PATCH -F required_approving_review_count=0
# 3. Squash-merge with admin override (admin override now succeeds because the
# review-approval requirement is the only block enforce_admins refuses).
gh pr merge <pr-number> --squash --delete-branch --admin
# 4. Restore approver-count to 1.
gh api repos/<owner>/<repo>/branches/main/protection/required_pull_request_reviews \
-X PATCH -F required_approving_review_count=1रैप किया हुआ रूप: उस परमाणु Python रैपर के लिए scripts/dev/admin_merge.py देखें जो चरण 2 → 3 → 4 को एकल गैर-अंतःक्रियात्मक अनुक्रम में निष्पादित करता है, चरण 3 की विफलता पर try / finally रोलबैक सुरक्षा के साथ।
python scripts/dev/admin_merge.py <pr-number>3. अपरिवर्तनीय
- टॉगल विंडो न्यूनतम। चरण 2 → 3 → 4 एकल गैर-अंतःक्रियात्मक अनुक्रम में निष्पादित होते हैं। प्रोटेक्शन केवल मर्ज API कॉल की अवधि के लिए अपनी शिथिल अवस्था में रहता है — हर देखे गए रन में एक सेकंड से कम।
- पुनर्स्थापन बिना शर्त है। चरण 4 तब भी चलता है जब चरण 3 विफल हो जाए (रैपर का
try/finallyखंड किसी भी निकास पथ पर पुनर्स्थापन सुनिश्चित करता है)। एक विफल मर्ज प्रयास प्रोटेक्शन को शिथिल अवस्था में नहीं छोड़ता। - CI गेटिंग पूरे समय बनी रहती है, जब तक
enforce_adminsचालू है।required_status_checksटॉगल से अप्रभावित रहता है;enforce_admins: trueके साथ मर्ज के लिए अब भी कॉन्फ़िगर किए गए स्टेटस-चेक संदर्भों का हरा होना आवश्यक है।enforce_admins: falseके साथ, चरण 3 का--adminमर्ज लाल आवश्यक चेक को भी बायपास करता है, इसलिए उस अवस्था में समारोह न चलाएँ। - ऑडिट निशान दृश्यमान।
gh pr merge --adminएनोटेशन PR के मर्ज मेटाडेटा में दिखाई देता है; प्रोटेक्शन-API टॉगल रिपॉज़िटरी के ऑडिट लॉग में अनुरक्षक की पहचान के अंतर्गत दिखाई देते हैं।
4. समारोह का उपयोग कब नहीं करना चाहिए
जब तक प्रोटेक्शन 0 अनुमोदक समीक्षाओं की माँग करता है या enforce_admins को बंद रखता है, तब तक समारोह अनावश्यक है: अनुभाग 1 में वर्णित तरीके से सीधे मर्ज करें।
यह समारोह अनुरक्षक के अपने PR के स्व-मर्ज के लिए है। जब कोई सहकर्मी समीक्षक उपलब्ध हो (लिखने की पहुँच वाला कोई योगदानकर्ता), तब मानक gh pr review --approve + gh pr merge --squash --delete-branch मार्ग सही है और समारोह अनावश्यक है।
यदि रिपॉज़िटरी किसी दूसरे अनुरक्षक को ऑनबोर्ड करती है, तो समारोह को सेवानिवृत्त कर दें: मानक PR-समीक्षा प्रवाह बिना किसी टॉगल के प्रोटेक्शन के मानवीय-समीक्षा अभिप्राय को पुनर्स्थापित कर देता है।
5. किसी पिछले रन का ऑडिट
प्रत्येक समारोह आह्वान तीन टिकाऊ सतहों पर दर्ज होता है, जिनका निरीक्षण कोई ऑपरेटर बाद में कर सकता है:
- PR का मर्ज मेटाडेटा।
gh pr view <pr-number> --json mergedBy,mergedAt,mergeCommitमर्ज कर्ता, मर्ज टाइमस्टैम्प, और squash कमिट का SHA लौटाता है।mergedByकर्ता उस अनुरक्षक पहचान से मेल खाता है जिसने चरण 3 चलाया। - रिपॉज़िटरी का ऑडिट लॉग।
gh api /repos/<owner>/<repo>/actions/runs --jq '.workflow_runs[] | select(.event=="push")'मर्ज-पश्चात CI रन को मर्ज कमिट से सहसंबद्ध करता है; रिपॉज़िटरी का प्रोटेक्शन-नियम ऑडिट लॉग (Settings → Branches UI के माध्यम सेgh api /repos/<owner>/<repo>/branches/main/protectionका इतिहास) मर्ज विंडो को घेरने वाले चरण 2 और चरण 4 के टॉगल दिखाता है। - अनुरक्षक का git इतिहास।
git log main --first-parent --onelinemainपर हर squash-मर्ज कमिट को कमिट विषय में संबंधित PR संख्या (gh pr merge --squashडिफ़ॉल्ट के अनुसार(#<pr-number>)प्रत्यय) के साथ सूचीबद्ध करता है, जिससे ऑपरेटर किसी भी पिछली लैंडिंग को उसके PR और समारोह आह्वान तक वापस ट्रेस कर सकता है।
जब scripts/dev/admin_merge.py एंट्री पॉइंट होता है, तब उसका गैर-अंतःक्रियात्मक लॉग (stderr) तीन प्रोटेक्शन-API कॉल और मर्ज-API कॉल को क्रम में नामित करता है; उसके stderr को tee में पाइप करने (2>&1 | tee) से GitHub-पक्ष की लॉग प्रतिधारण पर निर्भर हुए बिना प्रति-रन ऑडिट अंश दर्ज हो जाता है।