17

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


我看到以下问题:

深入目录结构

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

/home/user/project/.git/hooks

我在文件夹中

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

子模块

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

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

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

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

4 回答 4

17

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

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

获取 hooks 目录的路径。

这记录在git rev-parse 联机帮助页中

于 2012-12-28T17:39:01.323 回答
13

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

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

请参阅Ævar Arnfjörð Bjarmason ( ) 的提交 867ad08提交 de0824e提交 bf7d977提交 49fa52f(2016 年 5 月 4 日(由Junio C Hamano 合并 -- --提交 6675f50中,2016 年 5 月 17 日)avar
gitster

因此,请确保检查是否git config core.hooksPath已定义,因为它将覆盖默认的钩子文件夹位置。

git config文档现在包括:

core.hooksPath

默认情况下,Git 会在 ' $GIT_DIR/hooks' 目录中寻找你的钩子。
将此设置为不同的路径,例如“ /etc/git/hooks”,Git 将尝试在该目录中查找您的钩子,例如“ /etc/git/hooks/pre-receive”而不是“ $GIT_DIR/hooks/pre-receive”。

路径可以是绝对的或相对的。相对路径被视为相对于运行挂钩的目录


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

因此,要获得有效 hooks路径,您需要运行:

git rev-parse --git-path hooks

git rev-parse 手册页

--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 ( )的提交 9445b49(2016 年 8 月 16 日) 。(由Junio C Hamano 合并 -- --d05d0e9 提交中,2016 年 8 月 19 日)dscho
gitster

于 2016-05-18T07:37:28.737 回答
5

除此之外,--git-dir您还可以使用以下内容来查找 git 存储库的根目录,因为这更通用,我只是在此处添加以完成:

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

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

于 2012-12-28T17:40:18.653 回答
1

如果您在项目目录中,您可以通过键入终端来了解当前的钩子路径

git config core.hooksPath

如果该值为空,那么您可以设置 .githooks 文件夹的路径,您可以通过键入此命令来执行此操作

git config core.hooksPath .githooks/

您现在会发现 hooks 路径已更改,您可以再次通过第一个命令进行确认。

于 2020-12-28T08:22:09.707 回答