Closed5

git hooksのローカル・グローバルの実行パターン

ピン留めされたアイテム
bisquit_devbisquit_dev

結果。

global core.hooksPathを
指定しない
global core.hooksPathを
指定する
local core.hooksPathを
指定しない
ローカルの .git/hooks が実行される(あれば) global core.hooksPathのフックが実行される
local core.hooksPathを
指定する
local core.hooksPathのフックが実行される local core.hooksPathのフックが実行される

フックはスコープ(global, local)ごとに実行されるわけではない。
単純にリポジトリルートで git config core.hooksPath で返されるディレクトリに存在するフックを実行する。
※ git configの優先度(読み込み順)はシステム → グローバル → ローカル 参考

bisquit_devbisquit_dev

デフォルトの .git/hooks とカスタム指定の core.hooksPath でグローバル・ローカルが動く、動かないという記事を見たが、諸説ありそうなので検証する。

パターンは以下。

global .git/hooks global core.hooksPath
local .git/hooks
local core.hooksPath
bisquit_devbisquit_dev

local .git/hooks x global .git/hooks

git config core.hooksPath
#=> ""

git config --global core.hooksPath
# => ""
echo '#!/bin/sh
echo "local pre-commit"' >> .git/hooks/pre-commit

chmod +x .git/hooks/pre-commit
touch sample
git add .
git commit -m "sample"
#=>
local pre-commit

デフォルトではグローバルフックはないから、当然この場合はローカルのフックが正しく動作する。

bisquit_devbisquit_dev

local .git/hooks x global core.hooksPath

mkdir -p ~/sample-githooks

echo '#!/bin/sh
echo "global pre-commit"' >> ~/sample-githooks/pre-commit

chmod +x ~/sample-githooks/pre-commit
git config --global core.hooksPath ~/sample-githooks
touch sample
git add .
git commit -m "sample"
#=>
global pre-commit

グローバルフックのみ実行される。

bisquit_devbisquit_dev

local core.hooksPath x global core.hooksPath

mkdir -p ./githooks

echo '#!/bin/sh
echo "local custom pre-commit"' >> ./githooks/pre-commit

chmod +x ./githooks/pre-commit
git config core.hooksPath ./githooks
touch sample
git add sample
git commit -m "sample"
#=>
local custom pre-commit

ローカルのカスタムフックのみ実行される。

このスクラップは3ヶ月前にクローズされました