Дали некогаш случајно сте ги туркале тајните во складиштето? Или можеби сте го туркале неформатираниот код, само за да морате да креирате натамошен "линтинг" коммис? Сите сме биле таму.
Git приклучоците се моќна алатка за спречување на овие проблеми со извршување на скрипти пред да се ангажирате или притиснете. сепак, споделувањето и стандардизирањето на овие приклучоци низ тим или проект може да биде предизвик.
Pre-commit е лесна за користење рамка за управување и споделување на повеќејазични git хакови, помагајќи ви да ги фатите проблемите пред дури и да ја напуштат вашата работна станица.
Започнување: Правилното поставување
Пред да можете да ја искористите моќта на пред-завршување, треба да го инсталирате и конфигурирате за вашите проекти.
Инсталација
Постојат неколку начини да го инсталирате Pre-Commit:
- macOS и Linux:
brew install pre-commit
- Python/Pip (преку платформа):
pip install pre-commit
- Други методи: За инсталации со користење на Conda или на Windows, ве молиме погледнете ја Официјалната документација.
Проектно-специфично поставување (Стандардниот начин)
Ова е најчестиот пристап за овозможување на пред-завршување во одреден проект:
-
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 на вашиот репозиториум. Од сега натаму, pre-commit автоматски ќе ги изврши своите чекови пред секој коммит што го правите во овој специфичен репозиториум.
Глобална поставеност (метод на поставување и заборавајте го)
Ако често започнувате нови проекти или клонирате репозиториуми и сакате претприемникот да биде активен по дефолт (ако постои конфигурација), можете да го поставите глобално.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
(Можете да изберете поинаков директориум ако сакате, само бидете сигурни дека е конзистентен во следниот чекор.)
Инициализирајте 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
Еве ја содржината на хаубата.
#!/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-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 репозиториум кој содржи пред-коммитски хакови.
- repo: URL на складиштето хостирање на приклучоците (на пример, https://github.com/pre-commit/pre-commit-hooks). Ова е многу добар начин за управување со зависности. Кога ќе знаете повеќе за алатката, можете да одите на складиштето.
- Rev: Таа ја одредува верзијата на приклучоците што треба да се користат, со врзување на или Git таг, SHA или гранка. Но, се препорачува секогаш да се користи одредена ознака или SHA (не гранка како мајстор) за да се осигура дека вашето поврзување не се распаѓа неочекувано кога оддалечениот репозиториум се ажурира.
- Hooks: Листа под секој репо запис. Секој елемент овде дефинира специфичен приклучок за користење од тој репозиториум.
- 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
Откако ќе се чувствувате удобно со основите, претплатата нуди повеќе напредни функции за фино прилагодување на вашиот работен тек.
Ручно вртење на кучињата
Додека хокеите автоматски работат наgit commit
, можеби ќе сакате да ги активирате рачно во други времиња:
- Извршете одредена кука: За да извршите една кука (на пример, да ја тестирате нејзината конфигурација или да ги примените нејзините промени без да се ангажирате), користете:
pre-commit run <hook_id>
Замена на<hook_id>
со вистинскиот ИД од вашата конфигурациска датотека.)
- Извршете ги сите датотеки: За да ги извршите сите конфигурирани приклучоци на секоја проследена датотека во вашиот репозиториум (не само фазирани промени), користете:
pre-commit run --all-files
Ова е корисно за почетно чистење или при додавање на нови куки во постоечки проект.
Креирање на сопствени локални куки
Понекогаш, може да имате специфични за проектот скрипти или чекови кои не се дел од јавен складиште за приколки.
- Напишете го вашиот скрипт: Креирајте го вашиот скрипт (на пример, скрипт за школки, скрипт за Python) во вашиот депозитар. За овој пример, да речеме дека креирате 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
датотеки. наlanguage: script
Типот е многу флексибилен; за специфични средини како што се Python или Node, можете да ги наведете оние за управување со зависности доколку е потребно.bash
Хокеј
Сепак, претплатата е многу паметна во однос на работните средини, бидејќи создава изолирана средина за работно време за алатките и потребните зависности.
Не сите куки, за жал, ја искористија функцијата за зависност, и можеби ќе треба сами да ги инсталирате алатките за да можете да го покренете кукот (мислам на терраформ, на пример)
Пред-ангажирање во тим и CI / CD животната средина
Додека претпријатието блеска на индивидуалните машини на програмерите, неговите придобивки се множат кога се интегрираат во тимските работни процеси и CI/CD цевките. Дури и со локално инсталирани предпријатнички куки, некој може случајно да се ангажира без куки (на пример, користејќиgit commit --no-verify
) или имаат застарена конфигурација на кука. Вашиот CI / CD цевка може да дејствува како конечен чувар.
Со извршување на проверките за пред-завршување во вашата CI цевка, ќе се осигурате дека нема да се спои код кој ги крши стандардите на вашиот проект.
pre-commit run --all-files
Оваа команда ги проверува сите датотеки во репозиториумот, а не само промените, обезбедувајќи сеопфатна валидација.
Концептуални CI Pipeline чекор (на пример, 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
Убаво е да имате концептуална цевка која работи со било кој CI систем, но ако користите акции на 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
Со интегрирањето на CI, циклусот е завршен и истата валидација се применува во средините на програмерите како и во средината на CI.
Заклучок
За да се реализира тамуимаЗа да биде подобар начин отколку рачните проверки и "опс" ангажира, ние истраживме како тоа може да се направи.pre-commit
Трансформирајте го вашиот работен тек за развој.
Со автоматизирање на проверките за сè, од грешки во белиот простор и тајно откривање до форматирање на кодот и лентирање, пред-коммит дејствува како вашиот неуморен локален чувар на квалитетот на кодот кој дури може да се интегрира "бесконечно" во цевките на CI / CD за да послужи како крајна врата за квалитет.