कभी गलती से एक भंडारण में रहस्यों को धक्का दिया है? या हो सकता है कि आपने अनियंत्रित कोड को धक्का दिया है, बस एक अनुसरण "लिंटिंग" प्रतिबद्धता बनाने के लिए? हम सभी वहां थे. ये छोटे गलतियां सीआई / सीडी पाइपलाइनों की विफलता और निराशाजनक देरी का कारण बन सकती हैं, सब कुछ नियंत्रण के कारण जो स्थानीय रूप से चलाया जा सकता था।
Git होक्स उन मुद्दों को रोकने के लिए एक शक्तिशाली उपकरण हैं जिन्हें आप प्रतिबद्ध या धक्का देने से पहले स्क्रिप्ट चलाते हैं. हालांकि, एक टीम या परियोजना के भीतर इन होक्स को साझा करना और मानकीकृत करना चुनौतीपूर्ण हो सकता है.
Pre-commit एक उपयोग करने में आसान फ्रेमवर्क है जो कई भाषाओं के git hooks को प्रबंधित और साझा करने के लिए आता है, जिससे आप समस्याओं को पकड़ने में मदद कर सकते हैं इससे पहले कि वे आपके कार्य स्टेशन को छोड़ दें।
शुरू करने के लिए: सही सेटिंग
इससे पहले कि आप प्री-कॉमट की शक्ति का लाभ उठा सकें, आपको इसे स्थापित करने और अपने परियोजनाओं के लिए कॉन्फ़िगर करने की आवश्यकता है।
स्थापना
Pre-commit को स्थापित करने के कई तरीके हैं:
- macOS और Linux के लिए:
brew install pre-commit
- Python/Pip (क्रॉस प्लेटफॉर्म):
pip install pre-commit
- अन्य तरीके: Conda का उपयोग करके या Windows पर स्थापित करने के लिए, कृपया आधिकारिक दस्तावेज़ देखें।
परियोजना विशिष्ट सेटिंग (Standard Way)
एक विशिष्ट परियोजना में प्री-कॉमट को सक्षम करने के लिए यह सबसे आम दृष्टिकोण है:
-
Create a Configuration File: In the root of your repository, create a file named
.pre-commit-config.yaml
. This file will define the hooks pre-commit should run. (We’ll cover how to populate this file in the next section).
-
Install Hooks: Navigate to your repository’s root directory in your terminal and run:
pre-commit install
- यह आदेश आपके रिपोर्टर के .git/hooks निर्देशिका में git hooks स्थापित करता है. अब से, प्री-कॉमिट स्वचालित रूप से इस विशिष्ट रिपोर्टर में आपके द्वारा किए गए प्रत्येक commit से पहले अपने चेक चलाएगा.
वैश्विक सेटिंग (सेट It and Forget It)
यदि आप अक्सर नए प्रोजेक्ट शुरू करते हैं या रिसोर्टरी क्लोन करते हैं और आप चाहते हैं कि प्री-कॉमिट डिफ़ॉल्ट रूप से सक्रिय हो (यदि कोई कॉन्फ़िगरेशन मौजूद है), तो आप इसे वैश्विक रूप से सेट कर सकते हैं।init.templateDir
विशेषताएं
-
A Configuration File: All your repository must have a
.pre-commit-config.yaml
. This file will define the hooks that pre-commit should run. The best would be to use a template repository with a minimal pre-commit file.
-
Configure Git’s Template Directory: Tell Git to use a specific directory as a template for new repositories:
git config --global init.templateDir ~/.git-template
(आप यदि पसंद करते हैं तो आप एक अलग निर्देशिका चुन सकते हैं, बस अगले चरण में यह सुनिश्चित करें कि यह स्थिर है।
3. Template Directory में Pre-commit प्रारंभ करें: निम्नलिखित कमांड चलाएं:
pre-commit init-templatedir ~/.git-template
(अगर आपने पिछले चरण में एक अलग निर्देशिका चुनी है, तो~/.git-template
इसीलिए )
यह एक बड़ा फायदा है: इस वैश्विक सेटिंग के साथ, किसी भी नए रजिस्टर को आप प्रारंभ करते हैं (git init
) या एक क्लोन के पास स्वचालित रूप से प्री-कॉमिट का होक स्थापित होगा. यदि एक रिपॉजिटरी में कोई.pre-commit-config.yaml
फ़ाइल, प्री-कॉमिट बस कुछ नहीं करेगा, इसलिए इसे वैश्विक रूप से सक्षम करना सुरक्षित है।
हालांकि, मैं एक डिफ़ॉल्ट हॉक जोड़कर एक कदम आगे जाना पसंद करता हूं~/.git-template/hooks/pre-commit
यह विफल हो सकता है यदि एक रजिस्ट्रेशन में कोई.pre-commit-config.yaml
यहाँ है Hook की सामग्री।
#!/usr/bin/env bash
if [ -f .pre-commit-config.yaml ]; then
echo 'pre-commit configuration detected, but `pre-commit install` was never run' 1>&2
exit 1
fi
अपनी कॉन्फ़िगरेशन का निर्माण (.pre-commit-config.yaml)
Pre-commit का दिल है.pre-commit-config.yaml
फ़ाइल. यह फ़ाइल, आपके रिपोरेटरी के जड़ पर रखा गया है, आपको बताता है कि किस चेक को चलाने के लिए प्री-कॉमट करें. यहां ऐसी कॉन्फ़िगरेशन का एक छोटा उदाहरण है.
# https://github.com/xNok/infra-bootstrap-tools/blob/main/.pre-commit-config.yaml
repos:
# Lint all yam files
- repo: https://github.com/adrienverge/yamllint.git
rev: v1.29.0
hooks:
- id: yamllint
# Runs Ansible lint
- repo: https://github.com/ansible/ansible-lint
rev: v24.7.0
hooks:
- id: ansible-lint
args:
- "ansible"
additional_dependencies:
- ansible
मुख्य रूप से समझाया गया
एक विशिष्ट कॉन्फ़िगरेशन में रेपोरेटरीज़ की एक सूची शामिल है, जिनमें से प्रत्येक में विशिष्ट हाउस होते हैं:
- repos: यह एक शीर्ष स्तर की कुंजी है जो रजिस्ट्रेशन मैपिंग की एक सूची लेती है. सूची में प्रत्येक आइटम एक Git रजिस्ट्रेशन निर्दिष्ट करता है जिसमें पूर्व-कॉमिट होक्स होते हैं।
- रीपो: रजिस्ट्री का URL है जो हक को होस्ट करता है (उदाहरण के लिए, https://github.com/pre-commit/pre-commit-hooks). यह निर्भरताओं को प्रबंधित करने का एक बहुत अच्छा तरीका है। जब आप उपकरण के बारे में अधिक जानते हैं, तो आप रजिस्ट्री पर जा सकते हैं।
- rev: यह एक Git टैग, SHA, या शाखा के लिए पिनिंग द्वारा उपयोग करने के लिए हैक के संस्करण को निर्दिष्ट करता है. लेकिन यह हमेशा एक विशिष्ट टैग या SHA (मास्टर की तरह एक शाखा नहीं) का उपयोग करने की सलाह दी जाती है ताकि आप सुनिश्चित करें कि आपके लिंटिंग अप्रत्याशित रूप से टूट न जाए जब रिमोट रिपॉजिटरी अद्यतन करता है.
- हाउस: प्रत्येक रेपो प्रविष्टि के तहत एक सूची. यहां प्रत्येक आइटम उस रिपो से उपयोग करने के लिए एक विशिष्ट हाउस को परिभाषित करता है.
- id: कोचिंग का अद्वितीय पहचानकर्ता (उदाहरण के लिए, trailing-whitespace, check-yaml)। आप कोचिंग रिकॉर्डर दस्तावेज़ में उपलब्ध कोचिंग आईडी पा सकते हैं. या बस .pre-commit-hooks.yaml रीपो के जड़ पर।
एक व्यावहारिक स्टार्टर कॉन्फ़िगरेशन
यहाँ एक बुनियादी.pre-commit-config.yaml
इस उदाहरण के लिए, मैं आपको Github पर जाने और एक नज़र रखने की सलाह देता हूंpre-commit
टीम ने लागू किया है, और जहां आप खोज सकते हैंid
आपके द्वारा इस्तेमाल की जाने वाली हर चीज के बारे में आप जान सकते हैं।
मैं कहूंगाtrailing-whitespace
औरend-of-file-fixer
वास्तव में उपयोगी हैं, इसलिए कॉन्फ़िगरेशन इस तरह दिखता है।
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0 # Check for the latest stable version on the pre-commit-hooks repo!
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
# Add other repositories and their specific hooks below
# - repo: ...
# rev: ...
# hooks:
# - id: ...
नोट: लकड़ी के लिए संस्करण समय के साथ बदलते हैं. यह समय-समय पर चेक करना अच्छा अभ्यास हैpre-commit-hooks
नवीनतम स्थिर संस्करण टैग के लिए रिकॉर्डर (या किसी भी अन्य हाक रिकॉर्डर आप उपयोग करते हैं) और अपनेrev
या ऑटोमेशन के साथ, जैसे कि Renovate या Dependabot, उन्हें नियमित रूप से अपडेट करने के लिए।
आप पहले से मौजूदा हाउस की एक बड़ी सूची पा सकते हैं.pre-commit-hooks.yaml
और देखें कि क्या होक्स उपलब्ध हैं।
Pre-Commit का उपयोग करते समय जानने के लिए अच्छा
एक बार जब आप बुनियादी चीजों के साथ सहज हो जाते हैं, तो प्री-कॉमिट आपके कार्य प्रवाह को ठीक करने के लिए अधिक उन्नत सुविधाएं प्रदान करता है।
मैन्युअल रूप से चलाने के लिए Hooks
जबकि हाउस स्वचालित रूप से चलता हैgit commit
, आप उन्हें अन्य समय पर मैन्युअल रूप से सक्रिय करना चाहते हैं:
- एक विशिष्ट हाउस चलाने के लिए: एकल हाउस को चलाने के लिए (उदाहरण के लिए, इसकी कॉन्फ़िगरेशन का परीक्षण करने या इसके बदलावों को लागू करने के बिना), का उपयोग करें:
pre-commit run <hook_id>
बदलें<hook_id>
अपने कॉन्फ़िगरेशन फ़ाइल से वास्तविक आईडी के साथ.)
- सभी फ़ाइलों पर चलाएं: अपने रिपोर्टर में हर ट्रैक किए गए फ़ाइल पर सभी कॉन्फ़िगर किए गए होक्स चलाने के लिए (केवल चरणबद्ध परिवर्तन नहीं), का उपयोग करें:
pre-commit run --all-files
यह एक प्रारंभिक सफाई के लिए उपयोगी है या एक मौजूदा परियोजना में नए होक्स जोड़ने पर।
अपने स्वयं के स्थानीय हॉक्स बनाने के लिए
कभी-कभी, आपके पास परियोजना-विशिष्ट स्क्रिप्ट या चेक हो सकते हैं जो एक सार्वजनिक होक रिकॉर्डर का हिस्सा नहीं हैं. Pre-commit आपको "स्थानीय" होक्स को परिभाषित करने की अनुमति देता है.
- अपने स्क्रिप्ट लिखें: अपने स्क्रिप्ट (उदाहरण के लिए, एक शेल स्क्रिप्ट, पायथन स्क्रिप्ट) अपने रिपोर्टर में बनाएं. इस उदाहरण के लिए, मान लीजिए कि आप my_custom_script.sh बनाते हैं.
- .pre-commit-config.yaml में परिभाषित करें: अपनी कॉन्फ़िगरेशन में एक स्थानीय होक आइटम जोड़ें:
# .pre-commit-config.yaml
- repo: local
hooks:
- id: my-custom-check
name: My custom check
entry: ./my_custom_script.sh # Path to your script
language: script # Or python, node, etc.
files: \.(py)$ # Example: regex to run only on Python files
# verbose: true # Uncomment for more output
# args: [--custom-arg] # Optional arguments for your script
यह कहता है प्री-कॉमिट चलाने के लिएmy_custom_script.sh
Python में परिवर्तन के लिए (.py
फ़ाइलें - Thelanguage: script
प्रकार बहुत लचीला है; पायथन या नोड जैसे विशिष्ट वातावरणों के लिए, आप आवश्यकतानुसार निर्भरताओं को प्रबंधित करने के लिए उन लोगों को निर्दिष्ट कर सकते हैं।bash
हाउस
फिर भी, प्री-कॉमिट काम के माहौल के संबंध में बहुत स्मार्ट है, क्योंकि यह उपकरणों और आवश्यक निर्भरताओं के लिए एक अलग runtime वातावरण बनाता है।
दुर्भाग्य से, सभी हाउस ने निर्भरता सुविधा का लाभ नहीं लिया है, और आपको खुद को हाउस चलाने में सक्षम होने के लिए उपकरण स्थापित करने की आवश्यकता हो सकती है (मैं उदाहरण के लिए टेराफॉर्म के बारे में सोच रहा हूं)
एक टीम और सीआई / सीडी माहौल में पूर्व प्रतिबद्धता
जबकि प्री-कॉमिट व्यक्तिगत डेवलपर्स मशीनों पर चमकता है, इसके लाभ जब टीम कार्य प्रवाहों और सीआई / सीडी पाइपलाइनों में एकीकृत होते हैं तो कई गुना बढ़ते हैं।git commit --no-verify
) या एक पुराना होक कॉन्फ़िगरेशन है. आपका सीआई / सीडी पाइपलाइन अंतिम गेटकेपर के रूप में कार्य कर सकता है।
अपने सीआई पाइपलाइन में पूर्व-कॉमट चेक चलाकर, आप सुनिश्चित करते हैं कि आपके परियोजना के मानकों का उल्लंघन करने वाला कोई कोड एकीकृत नहीं किया जाता है।
pre-commit run --all-files
यह आदेश रिकॉर्डर में सभी फ़ाइलों की जांच करता है, न कि केवल बदले गए, व्यापक सत्यापन सुनिश्चित करता है।
अवधारणात्मक सीआई पाइपलाइन चरण (उदाहरण के लिए, GitHub कार्रवाई):
# Example for a GitHub Actions workflow
# ... (other steps like checkout, setup python/node, etc.)
- name: Install pre-commit and dependencies
run: |
pip install pre-commit
# Install any other dependencies your hooks might need (e.g., linters)
# This might be minimal if your hooks install their own dependencies (common).
- name: Run pre-commit checks
run: pre-commit run --all-files
किसी भी सीआई सिस्टम के साथ काम करने वाला अवधारणात्मक पाइपलाइन होना अच्छा है, लेकिन यदि आप GitHub कार्यों का उपयोग करते हैं, तो आपको परेशान करने की ज़रूरत नहीं है;आधिकारिक कार्रवाई.
jobs:
pre-commit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-python@v3
- uses: pre-commit/action@v3.0.1
सीआई एकीकरण के साथ, चक्र पूरा हो जाता है, और डेवलपर माहौल में सीआई माहौल के रूप में समान सत्यापन लागू किया जाता है. यदि पाइपलाइन विफल हो जाता है, तो इसे प्री-कॉमट चलाकर स्थानीय रूप से ठीक करें.
निष्कर्ष
वहां महसूसहैमैन्युअल चेक और "ओप" प्रतिबद्धताओं की तुलना में एक बेहतर तरीका होने के लिए, हमने पता लगाया है कि यह कैसे हैpre-commit
अपने विकास कार्य प्रवाह को परिवर्तित करें।
व्हाइटस्पेस त्रुटियों और गुप्त पता लगाने से लेकर कोड प्रारूपण और लिंटिंग तक सबकुछ के लिए स्वचालित जांच करके, प्री-कॉमिट कोड गुणवत्ता के आपके थकाऊ स्थानीय संरक्षक के रूप में कार्य करता है जो यहां तक कि अंतिम गुणवत्ता गेट के रूप में कार्य करने के लिए सीआई / सीडी पाइपलाइनों में "सही तरह" एकीकृत कर सकता है।