Git フックを使用して、作業内容がコンピューターから送信される前にチェックします。
Git フックは、コミットやプッシュの直前など、決まった瞬間に Git が単独で実行するスクリプトです。 Preferences › Hooks の GitTree は、いつ何が実行されるかを示し、既製のテンプレートからフックを追加し、フックを編集してテスト実行し、オフとオンを切り替えて、リポジトリを通じてチームと共有することができます。
GitTree で無料で動作: すべてのローカル Git 機能。アカウントは必要ありません。
このページでは
始める前に
- リポジトリが開いています。フックは 1 つのリポジトリに属します。
- リポジトリは信頼されています。制限モードでは、Git はフックをまったく実行しません。これらは引き続き読み取りおよび編集できます (リポジトリ信頼)。
- フックはシェルスクリプトです。テンプレートはプレーンな
shを使用します。これは、macOS、Windows (Git for Windows まで)、および Linux がすべて提供します。
どこで見つけられますか
- コミット ボックス: コミット ボタンの下にある May run: … には、コミットが実行するフックがリストされます。 Manage Hooks でページが開きます。
- ツールバーの Tools、または左パネルの TOOLS セクション: Git hooks。
- リポジトリ タブのメニュー、またはコマンド パレット: Manage Git Hooks…、または
Alt+Shift+H。 - Preferences (
Mod+,) › Hooks。環境設定で「hooks」、「pre-commit」、または「husky」を検索しても見つかります。
| アクション | macOS | WindowsとLinux |
|---|---|---|
| Gitフックを管理する | ⌥⇧H | Alt+Shift+H |
| 設定を開く | ⌘, | Ctrl+, |
ステップ
フックページを開く
commit ボタンの下の Manage Hooks または
Alt+Shift+Hを使用します。複数のリポジトリを開いた状態で、Repository から 1 つを選択します。このページは、フックとは何か、3 ステップの How it works ガイド、およびこの記事へのリンクから始まります。何がいつ実行されるかを読む
What runs when はコミット フロー (pre-commit、prepare-commit-msg、commit-msg、post-commit) とプッシュ フロー (pre-push) を示します。各ステップには、Runs、Off、Not executable、または No hook、およびそれが Can stop the action かレポートのみかを示します。

このページでは、Git がコミット時とプッシュ時に実行できるフックに名前を付け、.githooks を介した共有を提供しています。GitTree はデモ リポジトリとのインターフェイスです。 フックを追加する
Add Hook…を押します。 When it runs の下でフックを選択します。 Start from で、テンプレート Git’s sample または Empty script を選択します。 Script のプレビューには、書き込まれる内容が正確に表示されます。 Create Hook はファイルを書き込み、実行できる状態にし、エディターで開きます。
スクリプトを編集する
Edit は行番号を含むスクリプトを開きます。変更して、Save (または
Mod+S) を押します。ファイルを開いてからディスク上でファイルが変更された場合、GitTree はファイルの上書きを拒否し、テキストを保持するため、再度開いて比較できます。テスト実行してみる
Test Run は、Git と同じように、コミットやプッシュを行わずにフックを実行します。 commit-msg と prepare-commit-msg には、確認するメッセージを入力します。出力がストリーミングされ、その結果が Git の動作を示します: Passed with exit code 0: Git would continue. または Failed with exit code 1: Git would stop here. Stop は長い実行を終了します。
フックをオフにするか共有する
フックの横にあるスイッチは、フックの名前を
<name>.disabledに変更してオフにし、再びオンにします。何も削除されません。 Share Through .githooks は、チームのリポジトリにフックを配置します (以下を参照)。
期待される結果
次のコミットまたはプッシュから、Git は Runs とマークされたフックを実行します。コミット ボックスの May run: … 行でフックに名前が付けられ、フックが何かを出力するかコミットを停止すると、フックの出力が Hook output の下に表示されます。
フックとは何か、そしてそれを使用する理由
Git はフック フォルダー (core.hooksPath で別途指定がない限り .git/hooks) 内で固定名の実行可能ファイルを検索し、一致する時点で実行可能です。 pre-commit や pre-push などのアクションの前に実行されるフックは、ゼロ以外のステータスで終了することでアクションを停止できます。その後で実行されるフック (post-commit や post-merge など) はレポートのみを実行できます。
- テストの失敗、lint エラー、残った競合マーカー、サイズが大きすぎるファイルなど、間違いがコンピューターから流出する前に検出します。
- コミット メッセージの一貫性を維持します。たとえば、すべてのメッセージに Conventional Commits や課題キーを含めます。
- CI の実行が失敗するのを待つのではなく、数秒でフィードバックを取得できます。
- フックをリポジトリに保持することで、チーム全体に同じチェックを提供します。
よく使うフック
| フック | Git を実行すると | 一般的な使用方法 |
|---|---|---|
| pre-commit | コミットが作成される前 | ステージングされたものに対する lint と簡単なテスト。メインでコミットをブロックする |
| prepare-commit-msg | メッセージを書く前に | ブランチ名からの課題キーをメッセージに入力します |
| commit-msg | メッセージを書いた後 | Conventional Commits などのメッセージ形式を確認してください |
| post-commit | コミットが作成された後 | 通知またはログに記録します。コミットを元に戻すことはできません |
| pre-push | 何かがリモートに送信される前に | 完全なテスト スイートを実行します。保護されたブランチへのプッシュを拒否する |
| post-merge | マージまたはプルの後 | ロックファイルが変更されたときに依存関係が再インストールされると言う |
| post-checkout | ブランチ切り替え後 | ビルド出力をクリーンアップするか、生成されたファイルを更新する |
pre-receive や update などのサーバー フックは、プッシュを受信するサーバー上でのみ実行されます。 GitTree は、存在する場合はリストしますが、テスト実行は行いません。
既製のテンプレート
| テンプレート | フック | 何をするのか |
|---|---|---|
| 主要なブランチを保護する | pre-commit | メインまたはマスター上で直接行われたコミットを停止します |
| 競合マーカーと空白をキャッチする | pre-commit | 残った競合マーカーまたは末尾の空白 (git diff --cached --check) を追加するコミットを停止します。 |
| 大きなファイルをブロックする | pre-commit | 5 MB を超えるファイルを追加するコミットを停止します |
| 発行キーを追加する | prepare-commit-msg | 各メッセージはブランチ名に課題キー (ABC-123 など) を付けて始まります。 |
| Conventional Commits | commit-msg | feat(parser): accept empty lines のような概要が必要です |
| プッシュする前にテストを実行する | pre-push | npm test、cargo test、go test、pytest、または make test を実行し、失敗した場合はプッシュを停止します。 |
| リモートブランチを保護する | pre-push | リモートのメインまたはマスターへの直接のプッシュを停止します |
| 依存関係リマインダー | post-merge | プルまたはマージ後にロックファイルが変更されたことを通知します |
各テンプレートは、PROTECTED="main master" や TEST_COMMAND="" などの設定が上部にある通常のスクリプトです。プロジェクトに合わせてエディターで変更してください。
テスト実行の内容
GitTree は git hook run を通じてフックを実行するため、Git は core.hooksPath を含む実際のアクション中とまったく同じようにフックを見つけて開始します。フックは作成された入力を取得します。
- pre-commit、pre-merge-commit、post-commit、および pre-auto-gc: 引数はありません。
- commit-msg および prepare-commit-msg: 入力したメッセージを含む一時ファイル。後で削除されます。
- pre-push: プッシュ リモートの名前と URL。入力に分岐はありません。
- post-merge:
0、通常のマージ後と同様。
チームとフックを共有する
.git/hooks のフックは決してコミットされないため、各クローンには独自のフックがあります。 Share Through .githooks はそれらをリポジトリ内の .githooks フォルダにコピーし、このリポジトリの構成で core.hooksPath をそれに設定します。フォルダーをコミットします。各チームメイトはクローン作成後にこれを 1 回実行します。
git config core.hooksPath .githooksUse This Clone’s Own Hooks はその設定を再度削除します。 .githooks フォルダと .git/hooks のフックはそのまま残ります。
1 つのコミットのフックをスキップする
コミット ボックスで Commit Options を開き、Skip Hooks (--no-verify) をオンにします。その後、Git はそのコミットの pre-commit と commit-msg をスキップします。 prepare-commit-msg と post-commit は引き続き実行されており、コミット ボタンの下の行にそのことが示されています。フックを長時間停止するには、[フック] ページでフックをオフにします。
何か問題が発生した場合
フックには Not executable が表示されますが、実行されません。
macOS と Linux では、Git は実行権限のないフック ファイルをスキップします。 Make Executableを押してください。 GitTree は、ファイルが読み取り可能な場所にのみ追加します。
「ディスクを開いてからフックが変更されました。再度開くと新しい内容が表示されます。」
別のプログラムまたはフック マネージャーがファイルを書き換えました。エディタを閉じて再度開き、変更を新しいコンテンツに適用します。
「このフックはリンクです。GitTree はリンク経由で書き込むことはありません。リンクが指すファイルを編集してください。」
フックはシンボリック リンクであり、多くの場合、フック マネージャーによって作成されます。それが指すファイル、またはそのツールの構成を編集します。
スクリプトは macOS では動作しますが、Linux では「不正なインタープリタ」または \
エラーで失敗します。
ファイルには Windows 行末尾 (CRLF) があります。編集者はそれらについて警告します。スクリプトを LF 行末で保存します。
Test Run はグレー表示されています。
その理由はボタンの横にあります。リポジトリを信頼する、フックをオンにする、フックを実行可能にする、またはこのフックは実際の Git 操作中にのみ入力を受け取ることに注意してください。
質問
フックは無料プランの一部ですか?
はい。フックの管理、編集、テスト実行、共有はローカル Git で行われるため、ホスティング アカウントは必要ありません。
GitTree をオフにするとフックは削除されますか?
いいえ。オフにすると、ファイルの名前が <name>.disabled に変更されます。スイッチをオンにすると、名前が元に戻ります。 GitTree はフックを削除しません。
作成したフックはコミットされますか?
.git/hooks にいる間はそうではありません。 Share Through .githooks を使用してフックをリポジトリに保持し、他のファイルと同様にフックをコミットします。
フックは Node.js または Python で作成できますか?
はい。 Git は、最初の行にプログラムを含むファイルを実行します (例: #!/usr/bin/env node)。エディターにはそのプログラムが Runs with node として表示されます。このプログラムは、フックを実行するすべてのコンピュータにインストールする必要があります。