【发布时间】:2018-05-19 08:15:09
【问题描述】:
我需要一种更方便地删除 Git 存储库分支的方法,因为“更新挂钩”正在阻止它们:
命令
git push -v -f --no-verify --delete origin test_branch
输出
remote: fatal: Not a valid commit name 0000000000000000000000000000000000000000
remote: error: hook declined to update refs/heads/test_branch
我目前正在暂时禁用更新挂钩,执行删除,然后恢复挂钩,因此我正在寻找更好的建议,甚至可能更改 Perl Git 挂钩。
我对 Perl 或 Git 钩子一无所知,所以我有这些问题
我无法向
push操作发送消息。实现这样的目标的最佳方法是什么?-
有没有办法从钩子中获取
push --delete事件?有点像
if ${push --delete} then skip hook checks -
有没有办法为
push操作创建自定义参数以跳过钩子?类似的东西if command line contains --imgod then skip hook checks
我完全在黑暗中摸索。
这是 Git 文档中的 update 钩子定义
更新挂钩 这个钩子由远程存储库上的 git-receive-pack 调用,当在本地完成 git push 时会发生这种情况 存储库。就在更新远程存储库上的 ref 之前, 更新挂钩被调用。它的退出状态决定了成功或 ref 更新失败。
钩子对每个要更新的 ref 执行一次,需要三个 参数:
正在更新的 ref 的名称,
存储在 ref 中的旧对象名称,
以及要存储在 ref 中的新对象名称
更新钩子的零退出允许更新引用。退出 具有非零状态的 git-receive-pack 无法更新它 参考。
这个钩子可以用来防止强制更新某些 refs 确保对象名称是一个提交对象,它是 由旧对象名称命名的提交对象的后代。那是, 强制执行“仅快进”政策。
它也可以用来记录 old..new 状态。然而,它不 知道整个分支集,所以它最终会发送一封电子邮件 但是,当幼稚地使用时,每个参考。接收后挂钩比较多 适合那个。
在限制用户只能访问 git 的环境中 网络上的命令,这个钩子可以用来实现访问 控制而不依赖于文件系统所有权和组成员身份。 请参阅 git-shell[1] 了解如何使用登录 shell 来限制 用户只能访问 git 命令。
标准输出和标准错误输出都转发给git send-pack 在另一端,因此您可以简单地回显消息 用户。
默认的更新钩子,当启用时——使用 hooks.allowunannotated config 选项未设置或设置为 false——防止未注释的标签 推。
回答:
我找到了一种将分支删除事件捕获到更新钩子中并在所有其他情况下跳过钩子逻辑的方法:
zero="0000000000000000000000000000000000000000"
if [ "$refname" == "refs/heads/*"] && [ "$newrev" == "$zero" ];
then
exit 0
else
perform_your_checks()
fi
更多信息可以在 update.sample GIT 模板中找到。
【问题讨论】:
-
你能展示一下钩子吗?参见例如here 一些想法。
-
很抱歉,钩子太大,无法显示,但问题是它必须保持原样。我可以改进它,引入一个关于动作何时是“删除分支”的条件,问题是我需要了解如何识别该动作。
-
所以您的问题更像是如何“根据我的需要”调整挂钩?我担心人们只有在你提供钩子和你希望改变行为的条件以及它应该如何改变时才能提供帮助。
-
我的问题是我怎样才能得到那个事件,我正在推动一个分支删除:)
-
@ivoruJavaBoy:提供问题答案的首选方式是在答案字段中发帖,即使您正在回答自己的问题。 SO 鼓励这样做。这样,如果后一个更好的答案出现,它可以投票高于您的原始答案,人们可以留下仅与您的答案相关的 cmets,而不必将它们发布在问题上。