ホームページ >テクノロジー周辺機器 >IT業界 >Gitフックの紹介
クライアント側 - これらは開発者のシステムで実行されます
サーバー側 - これらはgitリポジトリをホストするサーバーで実行
この記事では、サーバー側のフックはカバーされません。ただし、プロジェクトがGitHubのようなサービスにある場合、サーバー側のフックは通常適用されないことに注意してください。 Githubでは、サーバー側のフックに相当するものは、プロジェクト設定にあるサービスとWebhookを使用することです。
フックファイルフックの例:PHP Syntaxの検証
<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.samplePHPには、構文検証に便利なオプションがあります:-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
が必要であることに注意してください。これは少し奇妙に思えるかもしれませんが! 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
これには、フックをバージョン制御下に置いておくという利点もあります。
他のフック
結論
<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/hooksにシンリンクすることにより、チームと共有できます。 >
gitフックを使用して、プロジェクトまたは会社のポリシーを実施できます。たとえば、サーバー側の事前受信フックを使用して、ポリシーに順守しないプッシュを拒否することができます(たとえば、特定の形式に従わないことをコミットします)。 gitフックを書くために使用できますか?gitフックはスクリプトであるため、スクリプト言語で書くことができます。デフォルトのサンプルはbashで記述されていますが、PythonやRubyなど、快適な言語を使用できます。 Gitフックは、Gitを他のツールと統合するために使用できます。たとえば、ポストコミットフックを使用して、継続的な統合サーバーのビルドをトリガーするか、問題追跡システムのチケットを更新できます。 gitフックのデバッグは、フックスクリプトからファイルに情報を書き込むことで実行できます。たとえば、コマンドの出力をログファイルにリダイレクトして後で検査することができます。gitフックを無視できますか?コミット、gitコミットコマンドで–No-verifyオプションを使用できます。これは、フックに実装されたチェックを必要としない小さな変更に取り組んでいる場合に役立ちます。強力で、注意して使用する必要があります。書かれていないフックは、すべてのコミットを拒否したり、データの損失を拒否したりするなど、問題を引き起こす可能性があります。展開する前に、常にフックを徹底的にテストしてください以上がGitフックの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。