在 shell 上找到 git hooks 目录的路径


Find path to git hooks directory on the shell

如何找到当前 Git 存储库的 .git/hooks 目录的完整路径?

我看到以下问题:

深入目录结构

我可能在 git 存储库目录结构的任何深处,例如

1
/home/user/project/.git/hooks

我在文件夹中

1
/home/user/project/foo/bar/baz/

子模块

较新的 git 版本将子模块元数据不放入 .git/ 而是放在主存储库中,而 .git 只是一个文件,例如

1
2
$ cat /home/user/project/vendor/foo/.git
gitdir: ../../.git/modules/vendor/foo

所以在这种情况下,钩子目录在

1
/home/user/project/.git/modules/vendor/foo/hooks


您可以使用 git rev-parse --git-dir 获取用于当前目录的存储库的路径。这将处理 gitlinks(使用文件代替 .git 目录)以及使用 $GIT_DIR 环境变量。 hooks 目录将始终在其中,因此您可以使用:

1
`git rev-parse --git-dir`/hooks

获取 hooks 目录的路径。

这记录在 git rev-parse 手册页中


从 git 2.9(2016 年 6 月)开始,您需要查看新的配置 core.hooksPath 以真正确定 hooks 文件夹。

git rev-parse --git-dir/hooks 已经不够用了。

参见 ??var Arnfj??r?° Bjarmason (avar) 的提交 867ad08、提交 de0824e、提交 bf7d977、提交 49fa52f(2016 年 5 月 4 日)。
(由 Junio C Hamano 合并 -- gitster -- 在提交 6675f50 中,2016 年 5 月 17 日)

所以请务必检查是否定义了 git config core.hooksPath,因为它会覆盖默认的钩子文件夹位置。

git config 文档现在包括:

1
core.hooksPath

By default Git will look for your hooks in the '$GIT_DIR/hooks' directory.
Set this to different path, e.g. '/etc/git/hooks', and Git will try to find your hooks in that directory, e.g. '/etc/git/hooks/pre-receive' instead of in '$GIT_DIR/hooks/pre-receive'.

The path can be either absolute or relative. A relative path is taken as relative to the directory where the hooks are run.

Git 2.10(2016 年第三季度)使用新的 core.hooksPath 设置。

所以要得到有效的hooks路径,你需要运行:

1
git rev-parse --git-path hooks

来自 git rev-parse 手册页:

1
2
3
4
5
--git-path <path>
    Resolve"$GIT_DIR/<path>" and takes other path relocation variables such
    as $GIT_OBJECT_DIRECTORY, $GIT_INDEX_FILE... into account. For example,
    if $GIT_OBJECT_DIRECTORY is set to /foo/bar then"git rev-parse
    --git-path objects/abc" returns /foo/bar/abc.

参见 Johannes Schindelin (dscho) 的提交 9445b49(2016 年 8 月 16 日)。
(由 Junio C Hamano 合并 -- gitster -- 在提交 d05d0e9,2016 年 8 月 19 日)


除了--git-dir,你还可以使用下面的方法来找到一个git仓库的根目录,因为这更通用,我只是在这里添加它来完成:

1
echo $(git rev-parse --show-toplevel)

然后将 /.git/hooks 附加到它?不过,我还没有尝试过使用子模块。


如果您在项目目录中
您可以通过输入 terminal

来了解当前的钩子路径

1
git config core.hooksPath

如果值为空,那么您可以设置 .githooks 文件夹的路径
你可以通过输入这个命令来做到这一点

1
git config core.hooksPath .githooks/

现在你会发现 hooks 路径改变了,你可以通过第一个命令再次确认。