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 之后执行(正如 Jefromi 在他的回答,但钩子仍未执行)

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 结帐中创建订单之前挂钩

Git:将“git clone”到现有文件夹的最佳实践是啥?

Pypi 发布自己的包

git clone

Woocommerce-在使用get_value插入钩子函数后,结帐列上的空白内容