更改默认的git hooks

rpl*_*evy 35 git githooks

不确定这是否可以在git中使用(我没有找到它,但我可能在我的搜索中使用了错误的词汇表),但是能够修改和启用钩子作为所有新存储库的默认值是有用的(在我的意思是创建的时间)所以每次创建新的存储库时都不必自定义这些.看起来这样做的简单方法是编写一个包装器,在我创建一个新的存储库时设置我的钩子和chmods,但如果有一种内置到git中的方法,我宁愿使用它而不是使用不必要的包装器脚本,而不是四处闲置.


澄清从评论复制到现在删除的答案:

我的问题是,是否可以更改所有新存储库的默认行为,因此不需要每次为每个新存储库以相同的方式自定义它们.简单的答案是编写一个包装器来创建和自定义repos(它生成钩子脚本并对它们进行chmod),但似乎这个默认行为也应该是可自定义的,而不必这样做.

Bri*_*ell 34

git-init手册页(git-clone如果您正在克隆现有的仓库而不是从头开始创建新仓库,也可以使用):

       --template=<template_directory>
           Provide the directory from which templates will be used. The
           default template directory is /usr/share/git-core/templates.

           When specified, <template_directory> is used as the source of the
           template files rather than the default. The template files include
           some directory structure, some suggested "exclude patterns", and
           copies of non-executing "hook" files. The suggested patterns and
           hook files are all modifiable and extensible.

您可以修改系统范围的模板目录(默认为/usr/share/git-core/templates,但可能位于计算机上的其他位置),您可以--template=<template_directory>在创建或克隆存储库时在命令行上提供,也可以在以下位置配置默认模板目录:你的配置文件:

[init]
     templatedir = /path/to/templates
Run Code Online (Sandbox Code Playgroud)

  • 哦,好吧,太棒了! (2认同)

Von*_*onC 26

使用git 2.9,您有一个用于集中挂钩的新选项: core.hooksPath

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

git config文档现在包括:

core.hooksPath
Run Code Online (Sandbox Code Playgroud)

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

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

如果您希望集中配置Git挂钩而不是基于每个存储库配置它们,或者作为一个更灵活和集中的 替代方案来init.templateDir更改默认挂钩的位置,则此配置变量非常有用.

这个路径的作者(ÆvarArnfjörðBjarmason avar)在他的提交中添加:

我打算在集中式Git服务器上使用它,用户可以在其下创建任意存储库/gitroot,但我想管理应该通过统一调度机制集中运行的所有挂钩.


Git 2.10使用了新的设置 git rev-parse --git-path hooks/<hook>

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

rev-parse:尊敬core.hooksPath--git-path

--git-path选项的思想不仅是为了避免必须在路径前面添加输出--git-dir,而且还要考虑.git目录内特定公共路径的覆盖
(例如,如果设置,git rev-parse --git-path objects将报告环境变量的值GIT_OBJECT_DIRECTORY).

在介绍core.hooksPath设置时,我们忘了相应调整git_path().这个补丁修复了这个问题.

  • 值得注意的是,这会阻止任何 `.git/hooks` 从 2.19 开始运行。我希望他们实现了更好的回退机制,例如,如果您有`.git/hook`,请改用它,或者同时运行两者。 (2认同)
  • @CiroSantilli新疆改造中心六四事件法轮功 提议向Git邮件列表进行演变可能是个好主意:“ hooksPathMode”,“ exclusive”(仅在一条路径中搜索)或“ combined”(在“ hooksPath”中首先搜索,退回到`。/ hooks`)。默认值:“`exlusive`”(当前模式) (2认同)

Jon*_*ler 5

使用 git 1.6.5.3(和一些早期版本),您可以在目录中获得示例挂钩.git/hooks

$ ls .git/hooks
applypatch-msg.sample     post-update.sample        prepare-commit-msg.sample
commit-msg.sample         pre-applypatch.sample     update.sample
post-commit.sample        pre-commit.sample
post-receive.sample       pre-rebase.sample
$ 
Run Code Online (Sandbox Code Playgroud)

它们在我的系统上都是可执行的。要使用其中一个挂钩,请复制或重命名该文件并删除“ .sample”后缀。根据您的要求进行适当编辑。


解决评论中的问题 - 要更改安装的默认示例挂钩,您需要找到git安装目录。在我的机器上,就是这样$HOME/git- 所以二进制文件位于$HOME/git/bin/git. 那么包含示例钩子的目录是:

$HOME/git/share/git-core/templates/hooks
Run Code Online (Sandbox Code Playgroud)

如果您编辑这些模板(请小心),那么这些模板将被复制到新的 git 存储库。它们仍然是样品,但它们将是您的样品。

我没有尝试过在目录中创建非示例文件;它可能会也可能不会被复制。不过,要小心更改默认设置 - 当您下次升级时,您将必须重做更改。

  • @rplevy:我可以看到澄清,因为我有足够的代表来查看已删除的答案;其他人不能(包括你)。编辑您的问题以匹配。我认为我的回答确实解决了你的问题,但我有偏见。具体来说,更改安装的默认模板的一种方法是编辑由“git init”复制的文件,这就是我所说的。Brian Campbell 还指出,有一种方法可以配置“git init”以使用非标准位置,但确保应用非标准选项可能会很有趣。您可能需要调查系统配置。 (2认同)