尝试在 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/dev
从faa849975f836d8ea4f69c098f1b369aef879c43
更新为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