如何将git钩子重新加载到模板钩子

时间:2017-08-24 17:52:32

标签: git templates github gitlab hook

我已经编辑了一些预先存在的钩子,并希望将它们设置为克隆存储库时的默认值。当我克隆一个新项目时,我可以看到我的钩子可用。因为我不想重新克隆我的所有项目,所以我希望能够将git模板重新加载到现有项目中。我在git init所在的同一目录中运行.git,但钩子永远不会覆盖我所在项目中预先存在的钩子。有人知道如何将模板挂钩重新加载到现有的克隆项目中吗? / p>

1 个答案:

答案 0 :(得分:1)

由于.git内部的文件本身没有版本化,并且Git不知道,例如,某些现有.git/hooks/pre-commit文件实际上是从某些早期模板安装的,因此Git不会覆盖现有文件来自更新模板的新内容。

是一种解决这个问题的方法,但至少有一次会有点痛苦。这是:不是在.git/hooks/name中为某些 name 设置“真正的”挂钩,而是将{em>间接指向<<{1>}的内容安装为.git/hooks/name / em>真正的钩子。

在Unix-ish系统上,这就像使.git/hooks/name成为所需钩子的符号链接一样简单,它可以存在于文件系统的任何地方。在.git/hooks/name中必须有可执行文件的其他系统上,您可以使.git/hooks/name成为单行可执行shell脚本(通常为两行),例如:

#! /bin/sh
exec /path/to/real/hook

再一次“真正的”钩子可以在任何地方生活。

关于相对路径的附注

此特定示例使用绝对路径。相对路径是可能的,但是你必须小心相对于什么。

如果您可以使用符号链接,则表示您正在相对于.git/hooks目录本身进行链接,因此从.git/hooks/pre-commit../../bin/pre-commit的符号链接“表示”{{1通过路径名代数并假设some/path/to/.git/hooks/../../bin/pre-commit和/或.git本身不是符号链接,解析为.git/hooks,即工作中的文件some/path/to/bin/pre-commit -树。但是如果你有一个脚本,bin/pre-commit是相对于脚本的当前工作目录,这与脚本的 location 无关。

幸运的是,../有一些非常有用的功能,例如:

git rev-parse

或:

git rev-parse --show-toplevel

生成顶级工作树和其中的git rev-parse --git-dir 目录(作为绝对或相对路径,但考虑到运行.git的进程的当前工作目录)。因此,如果要在工作树中运行git rev-parse文件:

bin/pre-commit

会做到这一点。