42

不确定这在 git 中是否可行(我还没有找到它,但我可能在搜索中使用了错误的词汇表),但是能够修改和启用钩子作为所有新存储库的默认值会很有用(在我的意思是创建时间),因此不必在每次创建新存储库时都对其进行自定义。似乎最简单的方法是编写一个包装器来设置我的钩子并在我创建新存储库时对它们进行 chmods,但是如果 git 中内置了一种方法,我宁愿使用它,而不是使用不必要的包装器脚本,但几乎没有。


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

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

4

4 回答 4

39

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

       --template=<模板目录>
           提供将使用模板的目录。这
           默认模板目录是 /usr/share/git-core/templates。

           指定时,<template_directory> 用作
           模板文件而不是默认文件。模板文件包括
           一些目录结构,一些建议的“排除模式”,以及
           非执行“挂钩”文件的副本。建议的模式和
           挂钩文件都是可修改和可扩展的。

您可以修改系统范围的模板目录(默认为/usr/share/git-core/templates,但可能位于您机器上的不同位置),您可以--template=<template_directory>在创建或克隆 repo 时在命令行中提供,或者您可以在中配置默认​​模板目录你的配置文件:

[init]
     templatedir = /path/to/templates
于 2009-12-29T23:51:41.987 回答
38

使用 git 2.9,您可以使用一个新选项来集中挂钩:core.hooksPath

请参阅Æ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 会在 ' $GIT_DIR/hooks' 目录中寻找你的钩子。
将此设置为不同的路径,例如“ /etc/git/hooks”,Git 将尝试在该目录中查找您的钩子,例如“ /etc/git/hooks/pre-receive”而不是“ $GIT_DIR/hooks/pre-receive”。

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

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

此路径的作者(Ævar Arnfjö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-parsecore.hooksPath:尊重--git-path

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

在介绍core.hooksPath设置时,我们忘记了git_path()相应的调整。这个补丁解决了这个问题。

于 2016-05-18T07:32:32.600 回答
4

使用 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
$ 

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


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

$HOME/git/share/git-core/templates/hooks

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

我没有尝试在目录中创建非示例文件;它可能会或可能不会被复制。但是,请注意更改默认值 - 下次升级时,您将不得不重做更改。

于 2009-12-29T23:46:57.123 回答
0

对于 MacPorts 目录将是/opt/local/share/git-core/templates/

为了与团队成员共享钩子或模板,我通常在项目中创建子目录,例如$PROJECT_DIR/lib/git/hooks 创建 Rake 任务或 shell 脚本以复制cp $PROJECT_DIR/git/hooks/* $PROJECT_DIR/.git/hooks. 符号链接不起作用。

于 2011-03-30T06:03:57.980 回答