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

时间:2012-12-28 17:05:53

标签: git

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


我看到以下问题:

目录结构深层

我可能位于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

所以在这种情况下,钩子dir在

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

4 个答案:

答案 0 :(得分:10)

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

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

获取hooks目录的路径。

git rev-parse manpage

中记录了这一点

答案 1 :(得分:6)

启动git 2。9(2016年6月),您需要查看新配置core.hooksPath以确定hooks文件夹。

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

commit 867ad08,见commit de0824ecommit bf7d977commit 49fa52fÆvar Arnfjörð Bjarmason (avar)(2016年5月4日)。
(2016年5月17日Junio C Hamano -- gitster -- commit 6675f50合并)

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

git config documentation现在包括:

core.hooksPath
  

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

     

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

Git 2。10(2016年第3季度)使用了新的core.hooksPath设置。

为了获得有效 hooks路径,您需要运行:

git rev-parse --git-path hooks

来自git rev-parse man page

--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.

commit 9445b49Johannes Schindelin (dscho)(2016年8月16日) (由Junio C Hamano -- gitster --合并于commit d05d0e9,2016年8月19日)

答案 2 :(得分:3)

除了--git-dir之外,您还可以使用以下命令查找git存储库的根目录,因为这更通用,我只是在这里添加它以完成:

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

然后将/.git/hooks追加到它?我没有尝试使用子模块。

答案 3 :(得分:1)

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

git config core.hooksPath

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

git config core.hooksPath .githooks/

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