Gitフックの紹介

Christopher Nolan
Christopher Nolanオリジナル
2025-02-21 08:58:11930ブラウズ

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 までご連絡ください。