偶然に秘密をリポジトリに押したことがありますか? もしくは、フォーマットされていないコードを押しただけでは、フォローアップの「レンティング」コミットメントを作成しなければなりませんか? 私たちは皆そこにいました。
Git ハックは、コミットする前にスクリプトを実行することによって、これらの問題を防止するための強力なツールです。
Pre-commit は、複数の言語の git ハックを管理し、共有するための使いやすいフレームワークであり、作業ステーションを離れる前に問題を解決するのに役立ちます。
スタート:正しい設定
Pre-commitのパワーを活用する前に、それをインストールし、プロジェクトに設定する必要があります。
設置
Pre-commit をインストールするには、いくつかの方法があります。
- macOSとLinux:
brew install pre-commit
- Python/Pip(クロスプラットフォーム):
pip install pre-commit
- 他の方法: Conda を使用してまたは Windows でインストールする場合は、公式文書を参照してください。
Project-Specific Setup (The 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 をインストールします. From now on, pre-commit will automatically run its checks before each commit you make in this specific repository.
グローバルセットアップ(Global Setup: Set 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
(あなたが好む場合は、別のディレクトリを選択できますが、次のステップで一貫性があることを確認してください。
Pre-commit を Template Directory で初期化する: 次のコマンドを実行します。
pre-commit init-templatedir ~/.git-template
(前のステップで別のディレクトリを選択した場合は、~/.git-template
したがって)。
これは大きな利点があります:このグローバル設定で、あなたが初期化する新しいリポジトリ(git init
)またはクローンは自動的にプレコミットのハックをインストールします。.pre-commit-config.yaml
pre-commit は単に何もしないので、グローバルで有効にするのは安全です。
しかし、私はデフォルトのハックを追加することによってさらに一歩進むのが好きです。~/.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の中心は、.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:これは、リポジトリのマッピングのリストを取るトップレベルのキーです. Each item in the list specifies a Git repository that contains pre-commit hooks.
- repo: ハックをホストするリポジトリのURL(例: https://github.com/pre-commit/pre-commit-hooks)。これは依存性を管理する非常に良い方法です。 あなたがツールについてもっと知るとき、あなたはリポジトリに向かうことができます。
- rev: これは、Git タグ、SHA、または分支にピンアップすることによって、使用するハックのバージョンを指定します。しかし、リモート レポジトリの更新時に、リインティングが予期せぬようにするために、特定のタグまたは SHA (マスターのような分支ではない) を常に使用することをお勧めします。
- hooks: each repo entry. Each item here defines a specific hook to use from that repository. ここにある各項目は、そのレポリオから使用する特定のハックを定義します。
- id: ハックのユニークな識別子(例えば、trailing-whitespace、check-yaml) は、ハック・レポジトリのドキュメントで利用可能なハック ID を見つけることができます。
実践的なスタートアップ構成
こちらは基本.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
repository (or any other hook repositories you use) for the latest stable version tag and update yourrev
または、Renovate または Dependabot などの自動化を適用して、これらを定期的に更新します。
You can find a large list of pre-existing hooks on the.pre-commit-hooks.yaml
ホイールが利用可能かどうかを確認する。
Pre-Commit を使うときに知っておくべきこと
あなたが基本的なことに満足すると、プレコンメットはあなたのワークフローを細かく調整するためのより高度な機能を提供します。
Hooks マニュアル
Hooks が自動的に起動する場合git commit
, あなたはそれらを他の時間に手動で起動したいかもしれません:
- 特定のハックを実行する: 単一のハックを実行するために(例えば、その構成をテストするか、変更を適用することなく)、使用する:
pre-commit run <hook_id>
(代替)<hook_id>
設定ファイルから実際の ID を入力します)。
- すべてのファイルで実行する: リポジトリ内のすべての追跡ファイル(ステージ変更だけでなく)ですべての構成されたハックを実行するには、以下の方法を使用します。
pre-commit run --all-files
これは、初期のクリーニングまたは既存のプロジェクトに新しいハックを追加するときに有用です。
独自のローカルホークを作成する
場合によっては、プロジェクト特定のスクリプトまたはチェックが公開のハック レポジトリの一部ではない場合があります。
- あなたのスクリプトを書く: あなたのスクリプト(例えば、シェルスクリプト、Pythonスクリプト)をリポジトリに作成します。
- .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
This tells pre-commit to run トップページmy_custom_script.sh
Python(Python)の変更について.py
ファイル: Thelanguage: script
タイプは非常に柔軟で、PythonやNodeのような特定の環境では、必要に応じて依存性を管理するための環境を指定できます。bash
ホークス
それでも、プレコンミットは作業環境に関して非常にスマートで、ツールと必要な依存性のための孤立したランタイム環境を作成します。
残念ながら、すべてのハックが依存性機能を活用しているわけではありませんが、ハックを実行するためにツールを自分でインストールする必要があります(例えばテラフォームを考えています)。
Pre-Commit in a Team and CI/CD Environment(チームとCI/CD環境でのプレコミット)
Pre-commit は個々のデベロッパーマシンに輝くが、その利点はチームワークフローや CI/CD パイプラインに統合された場合に倍増する。git commit --no-verify
)または時代遅れのハック構成を持っているあなたのCI/CDパイプラインは、究極のゲートケーパーとして機能することができます。
CI パイプラインで Pre-Commit チェックを実行することにより、プロジェクトの基準に違反するコードが合併しないようにします。
pre-commit run --all-files
このコマンドは、変更されたファイルだけでなく、リポジトリ内のすべてのファイルをチェックし、包括的な検証を確保します。
コンセプト CI パイプラインステップ(例えば、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 環境と同様に開発者環境で同様の検証が適用されます。
結論
そこで実現ハイ手動のチェックや「OOPS」の取り決めよりも、より良い方法であるため、我々はその方法を調べた。pre-commit
開発ワークフローを変える
ホワイトスペースのエラーや秘密検出からコードの形式化やリンクに至るまで、あらゆる点のチェックを自動化することで、pre-commit はコードの品質の無限のローカルガードとして機能し、最終的な品質ゲートとして機能する CI/CD パイプラインに「シームレスに」統合できます。