【问题标题】:How can I fix Jenkins error due to bad remote git repo由于远程 git repo 错误,如何修复 Jenkins 错误
【发布时间】:2014-03-21 00:22:29
【问题描述】:

尝试在 GitHub 拉取请求上运行 Jenkins 测试后,我遇到了以下错误:

error: some local refs could not be updated; try running
00:07:44  'git remote prune git@github.com:myrepo/myrepo.git' to remove any old, conflicting branches

运行以下任何或所有操作都不会修复它:

  • git remote prune git@github.com:myrepo/myrepo.git
  • git remote prune origin
  • git fetch origin -t --prune
  • git gc --prune=now

Jenkins 正在其工作区中运行此命令:

git fetch --tags --progress origin  +refs/pull/*:refs/remotes/origin/pr/*

这告诉我遥控器上有一个错误的参考:

git fetch --tags --progress origin  +refs/pul
l/*:refs/remotes/origin/pr/*
Warning: Permanently added the RSA host key for IP address '192.30.252.131' to the list of known hosts.
error: 'refs/remotes/origin/pr/2730' exists; cannot create 'refs/remotes/origin/pr/2730/head'
From github.com:myrepo/myrepo
 ! [new branch]      refs/pull/2730/head -> origin/pr/2730/head  (unable to update local ref)
error: some local refs could not be updated; try running
 'git remote prune origin' to remove any old, conflicting branches

在 Jenkins 上以 Won't Fix 关闭了一张关于类似错误的票:JENKINS-19591

我已经尝试删除远程引用:

git push origin :refs/origin/pr/2730/head
Warning: Permanently added the RSA host key for IP address '192.30.252.128' to the list of known hosts.
remote: warning: Deleting a non-existent ref.
To git@github.com:myrepo/myrepo.git
- [deleted]        refs/origin/pr/2730/head

之后我仍然遇到同样的错误:-(

如何修复远程拉取请求参考?

检查.git/logs/refs/remotes/origin/pr/后,我发现它抱怨的分支是唯一一个正常文件:

$ ls -ld .git/logs/refs/remotes/origin/pr/273*
drwxrwxr-x 2 jenkins jenkins 4096 Mar 21 08:05 .git/logs/refs/remotes/origin/pr/273
-rw-rw-r-- 1 jenkins jenkins  248 Mar 21 08:05 .git/logs/refs/remotes/origin/pr/2730
drwxrwxr-x 2 jenkins jenkins 4096 Mar 21 08:05 .git/logs/refs/remotes/origin/pr/2731
drwxrwxr-x 2 jenkins jenkins 4096 Mar 21 08:05 .git/logs/refs/remotes/origin/pr/2732
drwxrwxr-x 2 jenkins jenkins 4096 Mar 21 08:05 .git/logs/refs/remotes/origin/pr/2733
drwxrwxr-x 2 jenkins jenkins 4096 Mar 21 08:05 .git/logs/refs/remotes/origin/pr/2734
drwxrwxr-x 2 jenkins jenkins 4096 Mar 21 08:05 .git/logs/refs/remotes/origin/pr/2735


$ file .git/logs/refs/remotes/origin/pr/273*
.git/logs/refs/remotes/origin/pr/273:  directory
.git/logs/refs/remotes/origin/pr/2730: ASCII text
.git/logs/refs/remotes/origin/pr/2731: directory
.git/logs/refs/remotes/origin/pr/2732: directory
.git/logs/refs/remotes/origin/pr/2733: directory
.git/logs/refs/remotes/origin/pr/2734: directory
.git/logs/refs/remotes/origin/pr/2735: directory
.git/logs/refs/remotes/origin/pr/2736: directory
.git/logs/refs/remotes/origin/pr/2737: directory
.git/logs/refs/remotes/origin/pr/2738: directory
.git/logs/refs/remotes/origin/pr/2739: directory

$ find .git/logs/refs/remotes/origin/pr/ -maxdepth 1 -type f
.git/logs/refs/remotes/origin/pr/2730

$ cat .git/logs/refs/remotes/origin/pr/2730
0000000000000000000000000000000000000000 0c960f4b8bf30109536ec1b7a1d54a636e21fd87 Jenkins <ops@tangogroup.com> 1395389111 +0000 fetch --tags --progress git@github.com:TangoGroup/program_creator.git +refs/heads/*:refs/remotes/origin/*: storing head

内容看起来有点奇怪……不知道是不是应该是这样的……

【问题讨论】:

    标签: git github jenkins


    【解决方案1】:

    尝试运行

    git push origin :refs/remotes/origin/pr/2730/merge 
    git push origin :refs/remotes/origin/pr/2730/head 
    

    删除远程 PR 分支并重新运行您的 Jenkins 作业。

    【讨论】:

    • 对于未来的谷歌员工:修复是删除 both 远程仓库上的 headmerge 引用。
    【解决方案2】:

    从这部分来看:

    错误:'refs/remotes/origin/pr/2730' 存在;无法创建 'refs/remotes/origin/pr/2730/head'

    您的 Jenkins 工作似乎有一个 dirty 工作区:就好像 .git/logs/refs/remotes/origin/pr/2730/head 文件存在但无法替换它。更不用说,即使它在您的遥控器中不存在,它也试图创建它,这很奇怪。

    你介意清理你的工作空间吗? Jenkins 有一个菜单选项。完成此操作后,请确保真正删除了工作区目录。如果可以的话,通过直接查看文件系统来确认。

    更新

    您可以通过在另一台 PC 上运行 git fetch --tags --progress origin +refs/pull/*:refs/remotes/origin/pr/* 来重现该问题,这显然不是工作区问题。我认为this other question 很好地解释了正在发生的事情。

    【讨论】:

    • 有趣的是,干净的工作空间确实会发生这种情况。我认为问题实际上出在远程仓库上。感谢您指出我应该在工作区中签入.git/logs/refs .. 还没有想到要检查。请在问题中查看我上面的编辑,以获取有关其中内容的更多信息^^
    • 如果它是一个干净的克隆,并且远程上不存在 pr/2730,那么它如何在 Jenkins 中到达那里?如果你在你的 PC 上克隆 repo,你会看到同样的行为吗?
    • 如果我在我的电脑上做一个干净的克隆,它不会下载pr refs,我只有一个 HEAD ref:ls -l .git/logs/refs/remotes/origin/ total 8 -rw-r--r-- 1 jcuzella wheel 197 Mar 21 03:27 HEAD
    • jenkins 作业被配置为使用此 refspec 下载其他 refs:+refs/pull/*:refs/remotes/origin/pr/*,因此它肯定与远程 pr refs 相关。
    • 我可以在我的笔记本电脑上重现同样的问题:git fetch --tags --progress origin +refs/pull/*:refs/remotes/origin/pr/*
    【解决方案3】:

    不幸的是,我无法对答案添加评论(我认为这是合适的答案)。但是我们昨天在我们的 Jenkins 实例上遇到了这个问题,它有细微差别,所以我想把它留给未来遇到这种情况的人。

    对我们来说,删除 'merge' 和 'head' 引用并没有解决问题。 (这可能是因为它基于来自不受我们控制的分叉的拉取请求。请注意,该分叉上的分支没有损坏。)

    同样,我们试图删除远程引用上的整个 PR(基本上是在此页面上复制/粘贴答案,并更改 PR #),但这也没有解决问题。 (它删除得很干净,但在我修剪和重新获取后很快又出现了;好像我们的删除对遥控器没有影响。)这是因为拉取引用is read-only

    奇怪的是,只要合并到 master,合并哈希就会改变,但即使我们在 master 分支上进行了合并,这对我们来说仍然是损坏的。

    联系 Github 支持人员,并清楚地解释有问题的分支,并且错误为他们提供了解决问题所需的内容。 (从我的角度来看,我看到了所有 PR 的合并和头部引用的强制推送。)显然,您希望在联系他们之前清楚地了解问题,但在我们的例子中,它确实是在我们拥有的远程分支上无法控制。

    【讨论】:

    • 我同意前两点,但我没有足够的声誉以任何其他方式提供反馈,只能提供新的答案。
    【解决方案4】:

    我想在这里发表评论,因为我遇到了症状相同但根本原因不同的问题。我们的 Jenkins 正在运行 git fetch --tags --progress -- git@url_of_the_repo.git +refs/pull/*:refs/remotes/origin/pr/* +refs/heads/*:refs/remotes/origin/*,每个 PR 都输出为错误

     ! [new branch]      refs/pull/1/head -> origin/pr/1/head  (unable to update local ref)
    error: some local refs could not be updated; try running
    

    它的根本原因是一个名为pr 的现有远程分支。删除分支后,问题就消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 2022-07-06
      • 1970-01-01
      • 2021-01-30
      • 2023-03-31
      • 2021-06-07
      • 1970-01-01
      相关资源
      最近更新 更多