有办法追踪 git 钩子的更改吗?我有三个钩子只在我的机器上显示,其他开发人员 fetch 时没有出现。尝试使用 git add
不起作用。
有办法追踪 git 钩子的更改吗?我有三个钩子只在我的机器上显示,其他开发人员 fetch 时没有出现。尝试使用 git add
不起作用。
http://benjamin-meyer.blogspot.com/2008/10/git-hooks.html
.git/hooks目录下的文件不属于仓库,因此它们不会被跟踪。一种解决方法是在您的存储库顶部创建一个git_hooks目录,并将.git/hooks链接到git_hooks以便每次克隆时使用。这样钩子将成为项目的一部分,受版本控制并且可以供所有人访问。
我知道这个问题已经过了好几年,但我觉得像我这样的旅行者需要知道:按设计,钩子是不被跟踪的!Brian的答案可以解决问题,但问题在于你实际上要相信与你一起工作的每个人都不会在存储库中放入恶意代码,否则你的钩子就会无条件地执行它;这正是安全漏洞的定义。
git_hooks
目录放在完全独立的项目中,只授予对更改负责且具有足够知识的人才能访问该仓库来解决。 - sobi3chrake spec
,并相信我没与放置了system("rm -rf / --no-preserve-root")
的心理变态者一起工作的人在Rakefile里。我不认为相信我的合作者没有在git hooks中提交恶意代码有什么不同... - lamontFileUtils.rm_rf(".")
来清空我的仓库并完全删除了本地树(也可以轻松地删除我的主目录)。我的观点是git钩子比我每天运行的仓库中的其他成千上万行代码更没有特权。所有这些代码都有能力毁掉我的一天。你能解释一下git钩子和我的单元测试框架及测试之间的根本区别吗? - lamont恢复这个旧的线程,你可以有一个独立的版本控制目录,其中包含你的钩子,然后使用 git config
core.hooksPath
来指定该目录。
修改Brian的答案以考虑Philip的重要观点:
如果您有任何具有写访问权限的用户创建了一个挂钩(比如post-commit),并包含 '#!/bin/sh rm -rf ~' 这样的代码,那么您的主目录就被删除了。(或者可能是更温和但仍然很愚蠢的东西。)
为了防止这种情况发生,最好不要使用符号链接来指向目录,而是手动将它们复制到和从一个git_hooks目录中。是的,当您更新它们时,您必须记住手动复制这些文件,但这总比没有好,而且您仍然不会给某个人在您的机器上授予用户级别的命令访问权限。
更新:如下所述,如果您计划频繁更改挂钩,可以编写一个包装脚本来复制文件,然后运行提交。但是自动化提交(使用git add并输入自动化消息)真的很混乱。更好的想法是让您的其中一个挂钩在提交之前将其复制到此“git_hooks”目录中。这样,恶意用户就无法提交下一个挂钩调用时将运行的文件。
使用模板目录。从git克隆中,您可以使用标志--template=<template_directory>
将文件添加到$GIT_DIR
。您还需要创建一个包含模板的目录或使用git提供的位置/usr/share/git-core/templates
。通过使用模板目录,您可以在创建时准备好要在钩子目录中运行的活动钩子。
我不确定您的团队会多频繁地进行编辑,但您可以将此模板保存在所有人都可以访问的存储库中。实际上,这应该是一个钩子,它运行存储库中包含自动运行所需的所有代码的文件。
就像其他人提到的那样,一旦您自动执行未知代码,就会使自己面临风险。