Gitコミットフックをスキップする 質問する

Gitコミットフックをスキップする 質問する

Python コード内の print ステートメントを探す Git フックを調べています。print ステートメントが見つかった場合、Git コミットが防止されます。

このフックをオーバーライドしたいのですが、そのためのコマンドがあると聞きました。見つけることができませんでした。何かご意見はありますか?

ベストアンサー1

たぶん(からgit commitマニュアルページ):

git commit --no-verify -m "commit message"
           ^^^^^^^^^^^
-n  
--no-verify

このオプションは、pre-commitフックとcommit-msgフックをバイパスします。gitフック(5)

コメントしたようにブレイズは、-n特定のコマンドに対して異なる役割を持つことができます。
たとえば、git push -n実際には、予行演習プッシュです。フックをスキップする
だけです。git push --no-verify


注: Git 2.14.x/2.15 では--no-verify動作が改善されています:

見るコミット 680ee55(2017年8月14日)ケビン・ウィルフォード (``)(合併者
ジュニオ・C・ハマノ -- gitster--コミット c3e034f、2017年8月23日)

commitpre-commit:フックがない場合はインデックスの破棄をスキップします

" git commit" は、フックが途中でインデックスを更新した場合に備えて、インデックスを破棄してファイルシステムから再度読み取りを行っていましたがpre-commit、フックが実行されないことがわかっている場合は、これが最適化されて排除されましたpre-commit


ダヴィ・リマ指摘しているコメント欄git cherry-pick--no-verifyはサポートされていません
。そのため、cherry-pickがpre-commitフックをトリガーする場合は、次のようにします。このブログ投稿git cherry-pick を続行するには、何らかの方法でそのフックをコメント化/無効にする必要があります。

git rebase --continueマージ競合解決後の の場合にも、同じプロセスが必要になります。


Git 2.36 (2022 年第 2 四半期) では、の呼び出し元は、run_commit_hook()フックが成功したために「成功」​​したのか、フックがなかったために「成功」​​したのかを知ることができます。

見るコミット a8cc594(修正済みコミット 4369e3a1)、コミット 9f6e63b(2022年3月7日)エヴァル・アルンフィヨルド・ビャルマソン ( avar)(合併者
ジュニオ・C・ハマノ -- gitster--コミット 7431379、2022年3月16日)

hooks: 不明瞭な点を修正するトクトウ「フックを走った?」レース

署名者: Ævar Arnfjörð Bjarmason

修正するチェック時から使用時まで( TOCTOU )コード内の競合が追加された680ee55(" commit: コミット前のフックがない場合、インデックスの破棄をスキップする", 2017-08-14、Git v2.15.0-rc0 --マージ記載されているバッチ #3)。

このわかりにくい競合状態は、たとえば、" pre-commit" フックを実行してインデックスを変更したが、hook_exists()後で false を返す場合 (たとえば、フック自体がなくなったため、ディレクトリが読み取り不能になったなど) に発生する可能性があります。その場合、呼び出す必要があるときに
呼び出さなくなります。discard_cache()

競合状態自体はおそらく問題ではなく、ユーザーが実際にそれに遭遇する可能性は低いでしょう。
この問題は、680ee55 議論された、しかし修正されていませんでした。

プッシュ・トゥ・チェックアウトフックについてもこれを変更しましょう。フックが存在するかどうかをチェックしてプッシュ・トゥ・チェック
アウトまたはプッシュ・トゥ・デプロイを実行する代わりに、常にプッシュ・トゥ・チェックアウトを試みます。フックが
存在しない場合はプッシュ・トゥ・デプロイにフォールバックします。TOCTOU
競合なしで、以前と同じ動作です。
0855331(" receive-pack: プッシュ・トゥ・チェックアウト・フックのサポート", 2014-12-01, Git v2.4.0-rc0 --マージ) 以前の動作の導入。

hook_exists()重要な箇所が2箇所ある。「
参照トランザクション」チェックrefs.c、 見る6754159(" refs: 参照トランザクションフックを実装する", 2020-06-19, Git v2.28.0-rc0 --マージ記載されているバッチ #7)、および「prepare-commit-msg」フックについては、66618a5(" sequencer: 'prepare-commit-msg' フックを実行", 2018-01-24, Git v2.17.0-rc0 --マージ記載されているバッチ #2)。

どちらの場合も、フックがなければ何もしないデータをフック用に準備しないことで CPU 時間を節約しています。
したがって、これらのケースではこの"invoked_hook"パターンを使用する意味がありません。

reference-transaction」フックと「prepare-commit-msg」フックも競合しません。
これらのケースでは、追加された新しいフックと競合する場合はフックの実行をスキップしますが、ここで修正されている TOCTOU 競合では、必要なフック後のロジックを誤ってスキップしていました。

おすすめ記事