我已经编辑了一些预先存在的钩子,并希望将它们设置为库克隆时的默认设置。当我克隆一个新项目时,我可以看到我的钩子是可用的。因为我不想重新克隆我的所有项目,所以我希望能够将git模板重新加载到现有的项目中。我在git init所在的目录中运行.git,但是钩子从不覆盖我所在的项目中预先存在的钩子。有人知道如何将模板挂钩重新加载到现有的克隆项目上吗?
发布于 2017-08-24 18:34:00
由于.git内部的文件本身没有版本化,而且Git不知道,例如,一些现有的.git/hooks/pre-commit文件实际上是从以前的模板安装的,所以Git不会用更新模板中的新文件覆盖现有的文件。
有一种方法可以解决这个问题,但至少有一次会有点痛苦。这是:在.git/hooks/name中为某些name安装“真实”钩子,而是以.git/hooks/name的形式安装一些直接指向真正钩子的东西。
在Unix系统上,这就像使.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的符号链接意味着“some/path/to/.git/hooks/../../bin/pre-commit”,通过路径名代数,假设.git和/或.git/hooks本身不是符号链接,则解析到some/path/to/bin/pre-commit,即工作树中的文件bin/pre-commit。但是,如果您有一个脚本,../相对于脚本的当前工作目录,这与脚本的位置无关。
幸运的是,git rev-parse具有一些非常有用的功能,例如:
git rev-parse --show-toplevel或者:
git rev-parse --git-dir它生成顶层工作树和其中的.git目录(作为绝对路径或相对路径,但考虑到运行git rev-parse的进程的当前工作目录)。因此,如果您想在工作树中运行bin/pre-commit文件:
exec $(git rev-parse --show-toplevel)/bin/pre-commit会成功的。
https://stackoverflow.com/questions/45868052
复制相似问题