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

Ale*_*man 3 php git github

我们有一个 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)"]

Run Code Online (Sandbox Code Playgroud)

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

谢谢!

tor*_*rek 5

鉴于显示的哈希 ID,您似乎有两个或更多脚本或多或少同时运行。其中一个首先开始并看到该提交bc75782f3b77b5c03a254cecbf4e16856e2f4155——也许还有一些额外的提交——尚未在本地存储库中,但在远程存储库中,并开始检索它们。

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

第二个脚本即将完成的某个时间,第一个脚本完成。它有你的(本地)Git的更新(本地)origin/devfaa849975f836d8ea4f69c098f1b369aef879c43bc75782f3b77b5c03a254cecbf4e16856e2f4155,以便记住远程的Git它正在于名下origin,有bc75782f3b77b5c03a254cecbf4e16856e2f4155作为 dev。这将成功完成,第一个脚本现已完成。

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

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