目次
キーテイクアウト
フックはプロジェクトに配布されておらず、自動的にインストールすることもできません。したがって、あなたの最善の行動は、あなたが住む場所(同じリポジトリにある可能性がある)のための場所を作成し、コラボレーターにそれらを使用するように伝えることです。あなたが彼らのためにこれを簡単にするならば、彼らはそうする可能性が高くなります。
repare-commit-msg - 指定されていない場合はデフォルトのコミットメッセージを提供します。
自動化にGitフックを使用するにはどうすればよいですか?

Gitフックの紹介

Feb 21, 2025 am 08:58 AM

An Introduction to Git Hooks

Gitフックの紹介

キーテイクアウト

  • gitフックは、コミットされているファイルの構文をテストするなど、特定のアクションの前後に実行される簡単なスクリプトであり、環境が動作できるあらゆる言語で記述できます。
  • 2種類のフックが存在します。開発者のシステムで実行されるクライアント側と、Gitリポジトリをホストするサーバーで実行するサーバー側。
  • gitフックはプロジェクトに配布されておらず、自動的にインストールすることもできないため、フックがライブをして協力者に使用するように伝える場所を作成することが有益です。
  • gitフックは、プロジェクトのワークフローを自動化するための強力な手段であり、コードを検証し、メッセージをコミットし、環境が適切であることを確認できるようにします。
  • gitフックは、特定のアクションの前後に実行される簡単なスクリプトです。これらはさまざまなタスクに役立ちますが、主にクライアント側の検証に役立つので、簡単な間違いを防ぐことができます。たとえば、コミットされているファイルの構文をテストすることもできます。テストを実行することもできます。 Twig Syntaxを検証し、Jshintを標準に合わせて実行するフックを書きました。
  • gitフックもデザインで非常にシンプルです。スクリプトが実行可能であり、GITがエラー(ステータス0)でフックが終了する限り、アクション(たとえばコミットまたはプッシュ)が発生する場合、Gitはこれらのフックを実行します。フックは、環境が動作できるあらゆる言語で書くことができます。
  • フックには2種類のフックがあります

クライアント側 - これらは開発者のシステムで実行されます

サーバー側 - これらはgitリポジトリをホストするサーバーで実行

この記事では、サーバー側のフックはカバーされません。ただし、プロジェクトがGitHubのようなサービスにある場合、サーバー側のフックは通常適用されないことに注意してください。 Githubでは、サーバー側のフックに相当するものは、プロジェクト設定にあるサービスとWebhookを使用することです。

フックファイル
  • デフォルトでクローンを含むすべてのリポジトリには、.git/hooksディレクトリにフックのサンプルがあります:
  • そのディレクトリには、次のようなものが表示されます
コミットを許可する前に実行されるコミット前のフックに焦点を当てます。

フックの例:PHP Syntaxの検証

bashで書かれた非常にシンプルなフックから始めます。これは、「迅速な」が壊れたコミットが起こらないようにするためです。もちろん、私はテストをほとんどまたはまったく持たない「単純なコミット」を思いとどまらせますが、それはそれらが起こらないという意味ではありません。 .git/hooksでは、pre-commitという新しいファイルを起動できます。実行する権限が必要です:

<span>git clone git@github.com:symfony/symfony.git
</span><span>cd symfony
</span><span>ls .git/hooks</span>
ログイン後にコピー
ログイン後にコピー

お気に入りの編集者を使用して書き始めることができます。最初にシバンが必要です。私の好みの方法は、/usr/bin/envを使用することです。これは、ハードコード化された無効なパスではなく、必要なアプリケーションへの正しいパスを使用するためです。今のところ、簡単にテストできるように継続的に失敗します。

applypatch-msg.sample
commit-msg.sample
post-update.sample
pre-applypatch.sample
pre-commit
pre-commit.sample
prepare-commit-msg.sample
pre-push.sample
pre-rebase.sample
update.sample
ログイン後にコピー
ログイン後にコピー
PHPには、構文検証に便利なオプションがあります:-l。単一のファイル引数がかかるため、PHPファイルが変更されているものをループする必要があります。簡単にするために、コミットされているPHPファイルは常に.phpで終わると想定します。フックはリポジトリのルートから実行されるため、標準のgitコマンドを使用して、gitステータスなどの変更に関する情報を取得できます。

#alwaysフェールラインの上に、以下を使用してすべてのPHPファイルを変更することができます。

説明:

<span>cd .git/hooks
</span><span>touch pre-commit
</span><span>chmod +x pre-commit</span>
ログイン後にコピー
ログイン後にコピー

php_files = bashの割り当ては区切り文字なしで行われますが、変数を参照するには$ delimiter

が必要であることに注意してください。
    $()は「出力を取得」の構文です。これを使用するために引用符は必要ありません。
  • GREPは、追加された(a)および変更されたファイル(m)
  • を確認するために使用されています
  • awkはここで2ドルを印刷するために使用されています。完全なgitステータス - ショートラインには、開始時に追加のスペースと追加のデータがあるため、削除します。 awkは自動ストリッピングも実行します。
  • grepが再び使用されていますが、今ではラインが.php
  • で終わることを確認しています。
  • ここで、各ファイルをforループで確認できます:

これは少し奇妙に思えるかもしれませんが! php -l "$ i"(スペースの問題を回避するための引用符に注意)は、実際には、他の言語で通常予想される種類の値ではなく、0の返品値をチェックしています。参照のために、ほぼ同等のPHPコードは次のとおりです。

<span>#!/usr/bin/env bash
</span><span># Hook that checks PHP syntax
</span>
<span># Override IFS so that spaces do not count as delimiters
</span><span>old_ifs=$IFS
</span><span><span>IFS</span>=$'<span title="\n">\n'</span>
</span>
<span># Always fail
</span><span>exit 1</span>
ログイン後にコピー
ログイン後にコピー
これをテストするために意図的にSRC/Symfony/Component/Finder/Glov.phpに悪い変更を加えました。

ループをできるだけ早くループを終了させましたが、これは最終的に私たちが望むものではないかもしれません。実際、コミットしようとし続けなければならないのではなく、修正するものの要約を望んでいるかもしれません。誰でも簡単にイライラすることができ、gitコミットを使用することを学ぶことさえあります - フックを完全にバイパスするためにヴェル化しません。
<span>php_files=<span>$(git status --short | grep -E '^(A|M)' | awk '{ print  }' | grep -E '\.php$')</span></span>
ログイン後にコピー

代わりに、PHP -Lでエラーを終了しないようにしましょうが、私はまだ読みやすくしたいと思います:

<span>for file in $php_files; do
</span>  <span>if ! php -l "<span>$i"</span>; then
</span>    <span>exit 1
</span>  <span>fi
</span><span>done</span>
ログイン後にコピー
ここでは、PHP -Lの出力をキャプチャします(および標準誤差出力を標準出力に強制します)。特別な変数$を使用して、PHP -Lの出口ステータスを確認しますか? (これは出口ステータスコードです)とオペレーター-EQ。構文エラーが発生したことを述べています(文字列内の変数で$ {}の使用に注意してください)。最後に、エラーの関連する行に、出力をもう少し短くし続ける(「^parse error」のグレピング)を与え、これをもう少し読みやすくするために1つの空白行を与えます。

私は2つの悪い変更を加えました、そして、コミットの試みのための出力は次のように見えます:

<span>git clone git@github.com:symfony/symfony.git
</span><span>cd symfony
</span><span>ls .git/hooks</span>
ログイン後にコピー
ログイン後にコピー

今の行動方針は、これらの問題を修正し、テストし、再度コミットしようとすることです。

フックスクリプトを完成させるには、スクリプトの下部にある終了1を削除します。有効なPHPファイルをコミットしてみてください。通常どおり機能するはずです。

フックを共有

フックはプロジェクトに配布されておらず、自動的にインストールすることもできません。したがって、あなたの最善の行動は、あなたが住む場所(同じリポジトリにある可能性がある)のための場所を作成し、コラボレーターにそれらを使用するように伝えることです。あなたが彼らのためにこれを簡単にするならば、彼らはそうする可能性が高くなります。

これを行う簡単な方法の1つは、フックディレクトリとそれらをリンクするシンプルなインストーラーインストーラーを作成することです(コピーするのではなく):

あなたのプロジェクトをクローン化する人なら誰でも、単にbash install-hooks.shをクローニングした後に実行できます。
applypatch-msg.sample
commit-msg.sample
post-update.sample
pre-applypatch.sample
pre-commit
pre-commit.sample
prepare-commit-msg.sample
pre-push.sample
pre-rebase.sample
update.sample
ログイン後にコピー
ログイン後にコピー

これには、フックをバージョン制御下に置いておくという利点もあります。

他のフック

repare-commit-msg - 指定されていない場合はデフォルトのコミットメッセージを提供します。

    Commit-MSG - メッセージの検証をコミットします。
  • コミット後 - 成功したコミットの後に実行されます
  • pre-push - リモコンが動作することを確認した後、gitプッシュの前に実行されます。 2つの議論が必要です:リモートの名前とそれへのURL。
  • 前巻 - gitの前に実行されます。
  • チェックアウト後 - チェックアウトが成功した後に実行されます
  • マージ後 - マージが成功した後に実行されます。
  • これらのフックは一般に、議論を取り入れていますが、事前コミットと同じように機能します。チェックアウト後の1つのユースケースは、ファイルが常に適切な権限を取得することを確認することです(GITは実行可能であり、実行可能リンクではなく実行可能なもののみを追跡するため):
  • [subproject]メッセージのような標準に準拠していることを確認することをお勧めします。これはPHPの1つです:

結論
<span>cd .git/hooks
</span><span>touch pre-commit
</span><span>chmod +x pre-commit</span>
ログイン後にコピー
ログイン後にコピー

gitフックは、プロジェクトのワークフローを自動化するための強力な手段です。コードを検証したり、メッセージをコミットしたり、環境が適切であることを確認したり、さらに多くのことを可能にしたりできます。 Gitフックを使用しているものはありますか?コメントでお知らせください! gitフックに関するよくある質問(FAQ)

<span>#!/usr/bin/env bash
</span><span># Hook that checks PHP syntax
</span>
<span># Override IFS so that spaces do not count as delimiters
</span><span>old_ifs=$IFS
</span><span><span>IFS</span>=$'<span title="\n">\n'</span>
</span>
<span># Always fail
</span><span>exit 1</span>
ログイン後にコピー
ログイン後にコピー
さまざまな種類のgitフックは何ですか?

gitフックは、クライアント側とサーバー側のフックの2つの主要なタイプに分割されています。クライアント側のフックは、コミットやマージなどの操作によってトリガーされますが、サーバー側のフックはプッシュコミットの受信などのネットワーク操作で実行されます。各フックは、特定の運用上のニーズに合わせてカスタマイズできます。

gitフックを作成するにはどうすればよいですか?

gitフックを作成し、リポジトリの.git/hooksディレクトリに移動します。ここでは、さまざまなフック用のサンプルスクリプトがあります。新しいフックを作成するには、拡張機能(たとえば、事前にコミット)なしでファイルを作成し、実行可能にし、スクリプトを書き込みます。

自動化にGitフックを使用するにはどうすればよいですか?

Gitフックを使用して、開発ワークフローのさまざまなタスクを自動化できます。たとえば、事前コミットフックを使用して、各コミットの前にテストまたはコードのリナーを自動的に実行できます。これにより、テストされ、適切にフォーマットされたコードのみがリポジトリにコミットされます。これは、バージョンではない.gitディレクトリに保存されているためです。ただし、プロジェクト内の別のディレクトリにそれらを保存し、スクリプトを作成して.git/hooksにシンリンクすることにより、チームと共有できます。 >

gitフックを使用して、プロジェクトまたは会社のポリシーを実施できます。たとえば、サーバー側の事前受信フックを使用して、ポリシーに順守しないプッシュを拒否することができます(たとえば、特定の形式に従わないことをコミットします)。 gitフックを書くために使用できますか?

gitフックはスクリプトであるため、スクリプト言語で書くことができます。デフォルトのサンプルはbashで記述されていますが、PythonやRubyなど、快適な言語を使用できます。 Gitフックは、Gitを他のツールと統合するために使用できます。たとえば、ポストコミットフックを使用して、継続的な統合サーバーのビルドをトリガーするか、問題追跡システムのチケットを更新できます。 gitフックのデバッグは、フックスクリプトからファイルに情報を書き込むことで実行できます。たとえば、コマンドの出力をログファイルにリダイレクトして後で検査することができます。

gitフックを無視できますか?コミット、gitコミットコマンドで–No-verifyオプションを使用できます。これは、フックに実装されたチェックを必要としない小さな変更に取り組んでいる場合に役立ちます。強力で、注意して使用する必要があります。書かれていないフックは、すべてのコミットを拒否したり、データの損失を拒否したりするなど、問題を引き起こす可能性があります。展開する前に、常にフックを徹底的にテストしてください

以上がGitフックの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

CNCF ARM64パイロット:インパクトと洞察 CNCF ARM64パイロット:インパクトと洞察 Apr 15, 2025 am 08:27 AM

このパイロットプログラム、CNCF(クラウドネイティブコンピューティングファンデーション)、アンペアコンピューティング、Equinix Metal、およびActuatedのコラボレーションであるCNCF GithubプロジェクトのARM64 CI/CDが合理化されます。 このイニシアチブは、セキュリティの懸念とパフォーマンスリムに対処します

AWS ECSとLambdaを備えたサーバーレス画像処理パイプライン AWS ECSとLambdaを備えたサーバーレス画像処理パイプライン Apr 18, 2025 am 08:28 AM

このチュートリアルは、AWSサービスを使用してサーバーレスイメージ処理パイプラインを構築することをガイドします。 APIゲートウェイ、Lambda関数、S3バケット、およびDynamoDBと対話するECS Fargateクラスターに展開されたnext.jsフロントエンドを作成します。 th

2025年に購読する上位21の開発者ニュースレター 2025年に購読する上位21の開発者ニュースレター Apr 24, 2025 am 08:28 AM

これらのトップ開発者ニュースレターを使用して、最新のハイテクトレンドについてお知らせください! このキュレーションされたリストは、AI愛好家からベテランのバックエンドやフロントエンド開発者まで、すべての人に何かを提供します。 お気に入りを選択し、Relを検索する時間を節約してください

CNCFは、ARM64およびx86のプラットフォームパリティブレークスルーをトリガーします CNCFは、ARM64およびx86のプラットフォームパリティブレークスルーをトリガーします May 11, 2025 am 08:27 AM

ARM64アーキテクチャのオープンソースソフトウェアのCI/CDパズルとソリューション ARM64アーキテクチャにオープンソースソフトウェアを展開するには、強力なCI/CD環境が必要です。ただし、ARM64のサポートレベルと従来のX86プロセッサアーキテクチャには違いがありますが、これはしばしば不利な点にあります。複数のアーキテクチャのインフラストラクチャコンポーネント開発者は、職場環境に一定の期待を持っています。 一貫性:プラットフォーム間で使用されるツールとメソッドは一貫しており、人気の少ないプラットフォームの採用により開発プロセスを変更する必要性を回避します。 パフォーマンス:プラットフォームとサポートメカニズムは、複数のプラットフォームをサポートする際に展開シナリオが不十分な速度によって影響を受けることを保証するための優れたパフォーマンスを備えています。 テストカバレッジ:効率、コンプライアンス、および

カスタム電気通信ソフトウェアの利点 カスタム電気通信ソフトウェアの利点 May 11, 2025 am 08:28 AM

カスタマイズされた通信ソフトウェア開発は、間違いなくかなりの投資です。ただし、長期的には、このようなプロジェクトは、市場で既製のソリューションのように生産性を向上させる可能性があるため、より費用対効果が高い可能性があることに気付くかもしれません。カスタマイズされた通信システムを構築することの最も重要な利点を理解してください。 必要な正確な機能を取得します あなたが購入できる既製の通信ソフトウェアには2つの潜在的な問題があります。生産性を大幅に向上させることができる有用な機能が欠けているものもあります。いくつかの外部統合でそれらを強化することができることもありますが、それは常にそれらを素晴らしいものにするのに十分ではありません。 他のソフトウェアには機能が多すぎて、使用できないほど複雑すぎます。おそらくこれらのいくつかを使用しないでしょう(決して!)。通常、多くの機能が価格に追加されます。 あなたのニーズに基づいています

See all articles