git-clone 和结帐后挂钩
Posted
技术标签:
【中文标题】git-clone 和结帐后挂钩【英文标题】:git-clone and post-checkout hook 【发布时间】:2011-01-09 15:13:37 【问题描述】:根据手册,post-checkout
钩子在git checkout
之后运行(正如预期的那样),但也在git clone
之后运行(除非你通过--no-checkout
)。
很好,现在考虑以下几点:
git clone
之前没有本地存储库
挂钩未在遥控器之间同步
--template
一起使用的自定义模板目录中的钩子被复制为不可执行的,因此不在git clone
在git clone
之后执行post-checkout
挂钩似乎是不可能的。尽管如此,githooks
手册页 http://git-scm.com/docs/githooks 明确指出了一种避免执行它的方法,以及在执行它时传递的参数,这表明可以在 git-clone
之后执行自定义挂钩。
那么,这怎么可能?我显然在这里遗漏了一些东西。
结果
【问题讨论】:
git --version
的输出是什么?
查看我对版本依赖的回答!
【参考方案1】:
我想您可以进行自定义安装 - 重命名 .../share/git-core/templates/hooks
中的挂钩以删除 .sample
后缀。
您还可以创建一个包含符号链接的模板目录,指向存储库中的 hooks 目录(例如post-checkout -> ../../hooks/post-checkout
)。然后,如果克隆的 repo 包含那个特定的钩子,它就会被执行。
你是对的,不过,在大多数情况下它不会发生。
编辑:我刚刚对其进行了测试,--template
选项似乎确实保留了权限,所以这是实现它的更直接的方法。你看到了什么表明它剥夺了那个位?
关于版本的最终决定:您正在在线查看文档以获取比您正在使用的新版本的 git。 dfa7a6c 中添加了此功能(克隆:结帐时运行 post-checkout 挂钩); git describe 说直到 v1.6.2-rc2 才包含它。
【讨论】:
对,我刚刚测试过,结果发现它们实际上是用可执行位复制的(不知道为什么我虽然它被剥离了,但一定是在互联网上的某个地方读到的)。钩子仍然没有执行,这很奇怪,因为如果我在git clone
之后立即执行git checkout
,它会正确执行。你有什么版本的git?我在这里使用 1.6.0.4。我已经发布了要点中使用的确切程序:gist.github.com/287084
另外,我刚刚测试了将钩子放入/usr/share/git-core/template
并产生完全相同的结果
我用clone --template
做了一个快速测试——一个可执行的结帐后挂钩肯定是为我执行的。我使用当前的 git.git 版本(现在,git 1.7.0.rc0.8.ge3f67d)。我不是我当前系统上唯一的一个,所以尝试使用旧版本必须等到以后。
好的,现在看来我应该升级我的 Git 安装了!我明天要试试。谢谢大家的回答和时间:-)
@AsifKamranMalick 您可以编写一个安装脚本,这样人们只需运行一个一次性命令,但一般来说,不,不存在克隆后挂钩,我不希望它到。想象一下,如果有人将恶意代码推送到公共存储库中,然后简单地克隆它就会导致该代码运行。【参考方案2】:
来自githooks documentation:
当 git-init 运行时,一些示例挂钩被复制到新存储库的
hooks
目录中,但默认情况下它们都被禁用。要启用挂钩,请通过删除其.sample
后缀来重命名它。
此初始化作为创建克隆的一部分进行 - 请注意在 builtin-clone.c
中对 init_db
的调用。
例如:
$ cat /tmp/my-git-template/hooks/post-checkout #! /bin/bash echo "你好,从 $0" $ git clone --template=/tmp/my-git-template file:///tmp/repo.git my-clone 在 /tmp/my-clone/.git/ 中初始化空的 Git 存储库 远程:计数对象:3,完成。 远程:总计 3(增量 0),重用 0(增量 0) 接收对象:100% (3/3),完成。 你好来自 .git/hooks/post-checkout
【讨论】:
这里的文档更多地谈论在您自己的存储库中启用它,并且 OP 显然意识到了这一点。当然,你可以把安装目录下的模板去掉后缀(我已经贴出来了)。 所以它也适用于你的 - 要么是 OP 在测试中犯了一个愚蠢的错误,要么自 1.6.0 以来已经修复了一个错误 - 因为你链接到源,我怀疑你正在使用一个相当新的版本? 我正在运行 1.6.5.5。我可以访问另一个带有 1.5.5.6 的框,它复制了钩子并保留了执行位,但似乎没有执行它。以上是关于git-clone 和结帐后挂钩的主要内容,如果未能解决你的问题,请参考以下文章
WSL+samba+git:“错误:将对象添加到存储库数据库.git/objects的权限不足” / git-clone / git-add 权限错误
在验证之后但在 Woocommerce 结帐中创建订单之前挂钩