Git 挂钩是存储库本地的。
创建存储库后(git init yourRepo
),你会看到那些钩子yourRepo/.git/hooks
.
2016 年 5 月更新 git 2.9(2016 年 6 月)
你有一个新的配置:core.hooksPath
See commit 867ad08, commit de0824e, commit bf7d977, commit 49fa52f (04 May 2016) by Ævar Arnfjörð Bjarmason (avar).
(Merged by Junio C Hamano -- gitster -- in commit 6675f50, 17 May 2016)
core.hooksPath
默认情况下,Git 会在 '$GIT_DIR/hooks
' 目录。
将其设置为不同的路径,例如'/etc/git/hooks
',Git 会尝试在该目录中找到你的钩子,例如'/etc/git/hooks/pre-receive
' 而不是在 '$GIT_DIR/hooks/pre-receive
'.
该路径可以是绝对路径或相对路径。相对路径被视为相对于运行钩子的目录
“相对路径”部分来自Git Hooks 手册页:
在 Git 调用钩子之前,它将其工作目录更改为工作树的根目录在非裸存储库中,或者到$GIT_DIR
在一个裸存储库中。
原始答案(2014 年 2 月)
您可以指定不同的templatedir
(from git config)
init.templatedir
指定要从中复制模板的目录。 (参见“模板目录”部分git-init(1).)
默认模板目录包括一些目录结构,一些建议的“排除模式”,以及样本“hook”文件的副本.
建议的模式和挂钩文件都是可修改和可扩展的。
这意味着一个新的回购协议(git init
)将从自定义文件夹而不是默认文件夹(这是 git 安装的一部分)填充默认内容(包括默认示例挂钩)。
Roelant询问评论:
在 git 存储库之外保存 hooks 的用例是什么?
将 Git 挂钩存储在存储库之外对于各种用例都是有益的。
-
共享挂钩:
-
权限控制/安全:
-
版本控制:
+----------------------+ +---------------------+
| Individual Repo | | Centralized Hooks |
| (e.g., RepoA, RepoB) | | Directory |
+----------------------+ +---------------------+
| |
| Configure to use |
| centralized hooks |
+------------------------------>|
|
[Hooks Execution]
通过配置core.hooksPath
指向集中式或共享目录,可以有效解决上述场景。