尝试在 webhook 触发后在服务器上运行 git pull,但无法正常工作

Posted

技术标签:

【中文标题】尝试在 webhook 触发后在服务器上运行 git pull,但无法正常工作【英文标题】:Trying to run git pull on server after webhook triggers, not working correctly 【发布时间】:2021-07-09 00:43:10 【问题描述】:

我们有一个 php 脚本,它基于 github webhook 触发以在特定分支上执行 git pull。我可以轻松地手动运行命令,但是当我们尝试让脚本自动执行时,我们不断收到错误。

["error: cannot lock ref 'refs\/remotes\/origin\/dev': ref refs\/remotes\/origin\/dev is at bc75782f3b77b5c03a254cecbf4e16856e2f4155 but expected faa849975f836d8ea4f69c098f1b369aef879c43","From #####:#####\/#####"," ! faa8499..bc75782  dev        -> origin\/dev  (unable to update local ref)"]

不知道该怎么做,有什么想法吗?

谢谢!

【问题讨论】:

【参考方案1】:

鉴于显示的哈希 ID,您似乎有两个或多个脚本或多或少地同时运行。其中一个首先启动并看到提交 bc75782f3b77b5c03a254cecbf4e16856e2f4155(可能还有一些其他提交)尚未在本地存储库中,但在远程存储库中,并开始检索它们。

此时,other 脚本(或其中一个)启动。它也联系远程 Git 并发现提交 bc75782f3b77b5c03a254cecbf4e16856e2f4155。它也看到此提交尚未在本地 Git 存储库中。因此它开始检索任何必要的提交。

大约在 second 脚本快要完成的时候,first 脚本完成。它让您的(本地)Git 将您的(本地)origin/devfaa849975f836d8ea4f69c098f1b369aef879c43 更新为bc75782f3b77b5c03a254cecbf4e16856e2f4155,以便记住它正在与之交谈的远程Git,名称为origin,具有bc75782f3b77b5c03a254cecbf4e16856e2f4155 为它 dev。这成功完成,第一个脚本现在完成了。

第二个脚本现在也尝试用bc75782f3b77b5c03a254cecbf4e16856e2f4155 替换旧的origin/dev 值。但是origin/dev 不再包含旧值:它现在有bc75782f3b77b5c03a254cecbf4e16856e2f4155。这会产生您观察到的致命错误:第二个脚本的运行失败;它无法更新origin/dev,因为其他人在更新之前击败了它。

主要的解决方案是避免过于频繁地运行脚本,这样它就不会与其他运行脚本的实例竞争。第二个是忽略此特定错误,同时不忽略任何 other 更新失败,不是由于像这样的良性竞争。 Git 似乎应该认为这是一个非致命错误,因为存储在 origin/dev 中的值是 Git 想要存储在 origin/dev 中的值。

【讨论】:

这很有意义,我可以知道问题出在哪里。我们在服务器上有这个 repo 的另一个实例(从不同的分支中提取),这很可能是原因。谢谢!

以上是关于尝试在 webhook 触发后在服务器上运行 git pull,但无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

wbhook 通过 ngrok 连接到本地 node.js 服务器,服务触发 Webhooks 需要密码吗?

码云项目托管之自动化部署

为啥 Stripe 事件不会触发并且不会被 webhook 接收?

服务器无法访问到 Jenkins 的 SonarQube Webhook

如何让通用 Webhook 触发器插件与 Jenkins 中的多分支管道一起使用?

使用 Discord.js,如何在触发 webhook 时触发机器人?