我们希望制作一些我们都可以共享的基本钩子脚本 - 例如预格式化提交消息等。 Git的钩子脚本通常存储在<project>/.git/hooks/
之下。但是,这些脚本不会在人们进行克隆时传播,并且它们不受版本控制。Git钩子脚本可以与存储库一起管理吗?
有没有一种方法可以帮助每个人获得正确的钩子脚本?我可以让这些钩子脚本指向我的回购中的版本控制脚本吗?
我们希望制作一些我们都可以共享的基本钩子脚本 - 例如预格式化提交消息等。 Git的钩子脚本通常存储在<project>/.git/hooks/
之下。但是,这些脚本不会在人们进行克隆时传播,并且它们不受版本控制。Git钩子脚本可以与存储库一起管理吗?
有没有一种方法可以帮助每个人获得正确的钩子脚本?我可以让这些钩子脚本指向我的回购中的版本控制脚本吗?
从理论上讲,您可以使用所有脚本在您的项目目录中创建一个hooks
目录(或任何您喜欢的名称),然后在.git/hooks
中对它们进行符号链接。当然,每个克隆回购的人都必须设置这些符号链接(尽管你可能会非常喜欢并且有一个部署脚本,克隆人可以运行它们来半自动地设置它们)。
@Jefromi有一个很好的回答类似的问题和他的答案包含的代码展示了如何做@mipadi提示:
除此之外,这里是一个很好的博客文章中,我发现关于这个问题:
git-hooks怎么样,它的路径.git/hooks
调用到项目目录下的脚本githooks
。
还有很多功能可以使您尽可能减少复制和符号链接钩到处。
如果您的项目是一个JavaScript项目,并且您使用npm
作为包管理器,则可以使用shared-git-hooks在npm install
上强制执行githook。
在Git 2.9中, 配置选项core.hooksPath
指定了自定义挂钩目录。
将您的挂钩移至存储库中的hooks
跟踪目录。然后,库的配置每个实例使用跟踪hooks
而不是$GIT_DIR/hooks
:
git config core.hooksPath hooks
一般而言,路径可以是绝对的,或相对于在钩运行目录(通常工作树根;请参见man githooks
的说明部分)。
pre-commit
使预先提交钩子变得很容易。不回答OP关于管理任何任意git钩子的问题,但预先提交钩子可能是最常用于代码质量目的的。
我们正在使用Visual Studio解决方案(以及项目),这些解决方案具有构建事件前后的事件。我添加了一个名为'GitHookDeployer'的项目。项目自我修改后构建事件中的文件。该文件被设置为复制到构建目录。因此这个项目每次都会建立,永远不会被跳过。在构建事件中,它还确保所有git钩子都已到位。
请注意,这不是一个通用的解决方案,因为有些项目当然没有任何东西需要构建。
大多数现代编程语言或者他们的构建工具都支持插件来管理git钩子。这意味着你所需要做的就是配置你的package.json,pom.xml等,并且你的团队中的任何人都别无选择,除非他们改变了构建文件。 该插件将为您添加内容到.git目录。
例子:
一个很好的问题。我只希望有更好的答案(不要抱怨@mipadi,我只希望git有办法以更自动的方式做到这一点 - 即使只有指定给git clone的选项。) – lindes 2011-02-08 05:43:50
我同意,@ lindes!但是也许会限制这种有意识的分享?我想,事情会让Windows用户感到混乱。 – kristianlm 2011-09-21 11:21:34
@ kristianlm:有时候有各种各样的原因可能会让人觉得混乱......还有一些时候它很适合那里。我只是希望有一些选择或一些可以复制钩子的东西。我想我只需要在某个时候检查一下git-core代码,然后创建一个补丁。 :)(或者希望别人会......或者在[mipadi的回答](http://stackoverflow.com/a/427269/313756)或其他方法中使用解决方法) – lindes 2012-01-15 05:09:47