偶然に秘密をリポジトリに押したことがありますか? もしくは、フォーマットされていないコードを押しただけでは、フォローアップの「レンティング」コミットメントを作成しなければなりませんか? 私たちは皆そこにいました。 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 . This file will define the hooks pre-commit should run. (We’ll cover how to populate this file in the next section). .pre-commit-config.yaml 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 . 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. .pre-commit-config.yaml 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 これは大きな利点があります:このグローバル設定で、あなたが初期化する新しいリポジトリ( )またはクローンは自動的にプレコミットのハックをインストールします。 pre-commit は単に何もしないので、グローバルで有効にするのは安全です。 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の中心は、 このファイルは、あなたのリポジトリの根元に置かれ、実行するためのチェックを予備することを教えてくれます。 .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 を見つけることができます。 実践的なスタートアップ構成 こちらは基本 この例のために、私はあなたがGitHubを参照し、見ることをお勧めします。 こちらは、シンプルなホークのリストです。 チームが実装し、どこで見つけることができますか あなたが使いたいかもしれない関連するハックのそれぞれです。 .pre-commit-config.yaml pre-commit/pre-commit-hooks/blob/main/.pre-commit-hooks.yaml pre-commit id pre-commit/pre-commit-hooks/blob/main/.pre-commit-hooks.yaml 俺は言う そして 本当に便利なので、構成はこんな感じです。 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: ... 注: ハックのバージョンは時間とともに変化します. たまにチェックするのが良いです。 repository (or any other hook repositories you use) for the latest stable version tag and update your または、Renovate または Dependabot などの自動化を適用して、これらを定期的に更新します。 pre-commit-hooks rev You can find a large list of pre-existing hooks on the 私の経験から、このリストは完全ではない;代わりに、私は私が使用するのが好きなツールをチェックすることを好む ホイールが利用可能かどうかを確認する。 Pre-commit サイト .pre-commit-hooks.yaml Pre-commit サイト Pre-Commit を使うときに知っておくべきこと あなたが基本的なことに満足すると、プレコンメットはあなたのワークフローを細かく調整するためのより高度な機能を提供します。 Hooks マニュアル Hooks が自動的に起動する場合 , あなたはそれらを他の時間に手動で起動したいかもしれません: git commit 特定のハックを実行する: 単一のハックを実行するために(例えば、その構成をテストするか、変更を適用することなく)、使用する: pre-commit run <hook_id> (代替) 設定ファイルから実際の ID を入力します)。 <hook_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 トップページ Python(Python)の変更について ファイル: The タイプは非常に柔軟で、PythonやNodeのような特定の環境では、必要に応じて依存性を管理するための環境を指定できます。 ホークス my_custom_script.sh .py language: script bash それでも、プレコンミットは作業環境に関して非常にスマートで、ツールと必要な依存性のための孤立したランタイム環境を作成します。 残念ながら、すべてのハックが依存性機能を活用しているわけではありませんが、ハックを実行するためにツールを自分でインストールする必要があります(例えばテラフォームを考えています)。 Pre-Commit in a Team and CI/CD Environment(チームとCI/CD環境でのプレコミット) Pre-commit は個々のデベロッパーマシンに輝くが、その利点はチームワークフローや CI/CD パイプラインに統合された場合に倍増する。 )または時代遅れのハック構成を持っているあなたのCI/CDパイプラインは、究極のゲートケーパーとして機能することができます。 git commit --no-verify 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 パイプラインに「シームレスに」統合できます。