更改默认的git hooks

时间:2009-12-29 23:38:23

标签: git githooks

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


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

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

4 个答案:

答案 0 :(得分:32)

来自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>或克隆repo,或者您可以在配置文件中配置默认​​模板目录:

[init]
     templatedir = /path/to/templates

答案 1 :(得分:23)

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

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 documentation现在包括:

core.hooksPath
  

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

     

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

     

此配置变量在您需要的情况下非常有用   集中配置您的Git挂钩,而不是在a上配置它们   每个存储库的基础,或更灵活和集中   替代您已更改的init.templateDir   默认挂钩。

此路径的作者(ÆvarArnfjörðBjarmason avar)添加his commit

  

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

Git 2.10使用git rev-parse --git-path hooks/<hook>

中的新设置

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

  

rev-parse:尊重core.hooksPath

中的--git-path

--git-path选项的想法不仅是为了避免这种情况 输出为--git-dir的前缀路径,但也要尊重.git目录中特定公共路径的覆盖 (例如git rev-parse --git-path objects将报告该值 环境变量GIT_OBJECT_DIRECTORY,如果设置)。

  

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

答案 2 :(得分:3)

使用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存储库。它们仍然是样品,但它们将成为您的样品。

我没有尝试在目录中创建非样本文件;它可能会也可能不会被复制。但是要小心改变默认值 - 当你下次升级时,你将不得不重做这些更改。

答案 3 :(得分:0)

对于MacPorts,dorectory将为/opt/local/share/git-core/templates/

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