今天 pull 代码的时候碰到以下问题(隐去了一些公司敏感信息):

XXX@CN-00012645 MINGW64 /c/Gerrard/Workspace/XXX (master)
$ git pull
error: cannot lock ref 'refs/remotes/origin/feature/hy78861': is at d4244546c8cc3827491cc82878a23c708fd0401d but expected a6a00bf2e92620d0e06790122bab5aeee01079bf
From ssh://XXX
! a6a00bf2e92..f34729ba17a feature/hy78861 -> origin/feature/hy78861 (unable to update local ref)

这里首先是你的 feature/hy78861 这个分支出现了问题,由于你现在在 master 分支,如果只需要拉下来 master 的代码,那可以用以下命令作为替代(第一个解决方案):

XXX@CN-00012645 MINGW64 /c/Gerrard/Workspace/XXX (master)
$ git pull origin master
From ssh://XXX
* branch master -> FETCH_HEAD
......
Current branch master is up to date.
  • 由于 git pull 会把所有 remote 的信息全部拉下来,包括那个出错的分支 feature/hy78861,所以只 pull 你需要的分支信息就可以了。
  • 这是一个治标的办法,这样一来你每一次 pull 都需要带上分支信息,没办法一键同步所有的远程分支信息。

要治本需要了解问题的根本原因,看上面的 log 信息,应该是分支索引 id 的信息紊乱。

所以我们先搜一下 a6a00bf2e92620d0e06790122bab5aeee01079bf 的信息:

XXX@CN-00012645 MINGW64 /c/Gerrard/Workspace/XXX (master)
$ grep -ri 'a6a00bf2e92620d0e06790122bab5aeee01079bf'
.git/info/refs:a6a00bf2e92620d0e06790122bab5aeee01079bf refs/remotes/origin/feature/hy78861
.git/logs/refs/remotes/origin/feature/HY78861:214f906ff67841712d6082f1a471cae91385cf2c a6a00bf2e92620d0e06790122bab5aeee01079bf XXX 1616051165 +0800 pull: fast-forward
.git/logs/refs/remotes/origin/feature/HY78861:a6a00bf2e92620d0e06790122bab5aeee01079bf d4244546c8cc3827491cc82878a23c708fd0401d XXX 1623054120 +0800 pull: forced-update
.git/packed-refs:a6a00bf2e92620d0e06790122bab5aeee01079bf refs/remotes/origin/feature/hy78861

然后搜一下 d4244546c8cc3827491cc82878a23c708fd0401d 的信息:

XXX@CN-00012645 MINGW64 /c/Gerrard/Workspace/XXX (master)
$ grep -ri 'd4244546c8cc3827491cc82878a23c708fd0401d'
.git/logs/refs/remotes/origin/feature/HY78861:efaa737003ebf53deb81ba78cf62d395a6a03a0b d4244546c8cc3827491cc82878a23c708fd0401d XXX 1614914234 +0800 pull: fast-forward
.git/logs/refs/remotes/origin/feature/HY78861:d4244546c8cc3827491cc82878a23c708fd0401d f9650914c7a0fd3987a0dc106824d99c435297e3 XXX 1615431235 +0800 pull: storing head
.git/logs/refs/remotes/origin/feature/HY78861:c62e20a4c3a8a3860a915a8559cbf167da18a16f d4244546c8cc3827491cc82878a23c708fd0401d XXX 1616051205 +0800 pull: fast-forward
.git/logs/refs/remotes/origin/feature/HY78861:c62e20a4c3a8a3860a915a8559cbf167da18a16f d4244546c8cc3827491cc82878a23c708fd0401d XXX 1623053561 +0800 fetch: fast-forward
.git/logs/refs/remotes/origin/feature/HY78861:a6a00bf2e92620d0e06790122bab5aeee01079bf d4244546c8cc3827491cc82878a23c708fd0401d XXX 1623054120 +0800 pull: forced-update
.git/refs/remotes/origin/feature/HY78861:d4244546c8cc3827491cc82878a23c708fd0401d

最后再去 Gerrit 仓库,看一下这个 repo 的分支信息(我把一些信息抹掉了):

问题显然出在 feature/HY78861 和 feature/hy78861 上面,推测根本原因是:

  • 这两个 feature branch 都是在外国的同事创建的,他们的工作环境是 Linux 系统,而中国的工作环境是 Linux 系统,再加上他们可能做了些不知道什么的骚操作,由于系统差异导致问题。

我们重新观察错误信息:

cannot lock ref 'refs/remotes/origin/feature/hy78861': is at d4244546c8cc3827491cc82878a23c708fd0401d

看一下我们的本地文件 C:\Gerrard\Workspace\XXX\.git\refs\remotes\origin\feature\HY78861(注意这里是大写),文件内容是 :

  • d4244546c8cc3827491cc82878a23c708fd0401d

显然这就是错误里面定位的内容,那么是不是把这个文件里面的内容改成 expected 就行了呢?

很可惜,失败了:

XXX@CN-00012645 MINGW64 /c/Gerrard/Workspace/EXXX (master)
$ git pull
From ssh://XXX
+ a6a00bf2e92...d4244546c8c feature/HY78861 -> origin/feature/HY78861 (forced update)
error: cannot lock ref 'refs/remotes/origin/feature/hy78861': is at d4244546c8cc3827491cc82878a23c708fd0401d but expected a6a00bf2e92620d0e06790122bab5aeee01079bf
! a6a00bf2e92..f34729ba17a feature/hy78861 -> origin/feature/hy78861 (unable to update local ref)

这里文件中的信息,被强制从 a6a00bf2e92620d0e06790122bab5aeee01079bf 复原成了 d4244546c8cc3827491cc82878a23c708fd0401d。

这里我们总结一下问题:

  • HY78861 分支 remote 上的 id 是 d4244546c8cc3827491cc82878a23c708fd0401d
  • hy78861 分支 remote 上的 id 是 f34729ba17a48c9628dff31f8c6720843c6d1a74
  • id a6a00bf2e92620d0e06790122bab5aeee01079bf 来源未知,可能就是由于外国同事的某些骚操作引起的,可能是一个过期的 id 值,后来被上面的某一个覆盖了
  • C:\Gerrard\Workspace\XXX\.git\refs\remotes\origin\feature 这个文件目录下面,由于 Windows 系统的关系,只能存在 HY78861 或者 hy78861 两个文件之一

所以我们这里就有方案了:

  1. 根据上面的记录,保证 HY78861 和 hy78861 的分支映射关系正确,一共两处:packed-refs 和 info/refs。
  2. C:\Gerrard\Workspace\XXX\.git\refs\remotes\origin\feature 这个目录下面,保留一个 hy78864 或者 HY78864 文件,里面的内容随意,因为在执行 git pull 命令时会被覆盖。
  3. 如果是 HY78864,内容会变成 d4244546c8cc3827491cc82878a23c708fd0401d;如果是 hy78861,内容会变成 f34729ba17a48c9628dff31f8c6720843c6d1a74。

最后,git pull 执行成功

XXX@CN-00012645 MINGW64 /c/Gerrard/Workspace/XXX (master)
$ git pull
From ssh://XXX
+ f34729ba17a...d4244546c8c feature/HY78861 -> origin/feature/HY78861 (forced update)
Already up to date.
Current branch master is up to date.

项目记事【Git】:git pull 出错 error: cannot lock ref 'refs/remotes/origin/feature/hy78861': is at d4244546c8cc3827491cc82878a23c708fd0401d but expected a6a00bf2e92620d0e06790122bab5aeee01079bf的更多相关文章

  1. error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken...

    之前在自己的项目中添加了一个分支,然后做了一些操作,比如同步本地的分支情况到远程仓库中,然后在远程仓库中完成分支合并,以及 Pull request 等等操作,后来,在本地仓库中进行 git fetc ...

  2. Git Pull Failed: cannot lock ref 'refs/remotes/origin/xxxxxxxx': unable to resolve ref

    1.xxxxxxxx代表目录名称,我要pull的目录是supman_creditmall_v5: 2.从代码库中pull代码时报这个错误,代码pull失败: 3.解决办法,看下图,删除文件后再pull ...

  3. Git Push:error: Couldn't set refs/remotes/origin/master;error: update_ref failed for ref 'refs/remot

    作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=543 今天使用Git Push代码时产生错误: Rename from 'XXXX/.git/refs/remotes/ ...

  4. 【Mac】安装 Homebrew 出错 Failed during: git fetch origin master:refs/remotes/origin/master --tags --force

    今天在 Mac 装 Homebrew 遇到了一个问题,在网上找了大量解决方案,做个总结. Mac 版本 High Sierra 10.13.6. 问题描述 在 Mac 终端输入了 Homebrew 官 ...

  5. git pull报错,error: cannot lock ref导致拉流失败

    使用git命令删除相应refs文件,git update-ref -d refs/remotes/XXX,或者手动删除文件 简单粗暴强行git pull,执行git pull -p 原文:https: ...

  6. cygwin运行git submodule init出错error while loading shared libraries的解决

    installing the Devel\gettext package should solve your problem. git-submodule requires that. Unfortu ...

  7. homebrew update 出现Failure while executing: git pull --quiet origin refs/heads/master:refs/remotes/origin/master解决方案

    具体可以参考https://github.com/Homebrew/homebrew/issues/21002 cd /usr/local git status git reset --hard or ...

  8. homebrew安装问题(Failed during: git fetch origin master:refs/remotes/origin/master --tags --force)

    在mac系统中,使用homebrew可以很方便的管理包.按照官网的说明执行以下命令时总是报错: /usr/bin/ruby -e "$(curl -fsSL https://raw.gith ...

  9. git cannot lock ref

    参考博客:https://blog.csdn.net/lindexi_gd/article/details/79213042 错误原文: cannot lock ref ‘refs/remotes/o ...

随机推荐

  1. 【Redis过期Key监听】

    https://blog.csdn.net/wlddhj/article/details/89881055

  2. vim 中文乱码解决

    问题如下: 在vim中编辑一个中文文本时 出现中文乱码情况 问题解决: 修改vimrc的脚本配置 编辑~/.vimrc文件,加上如下几行即可: set fileencodings=utf-8,ucs- ...

  3. Android内核的编译和调试

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/70500488 一.Android内核源码的选择 Android手机设备内核源码的调 ...

  4. hdu3585 二分最大团(dp优化)

    题意       给你一些点( <= 50),让你找到k个点,使得他们之间的最小距离最大. 思路:       求最小的最大,我们可以直接二分去枚举距离,但是要注意,不要去二分double找距离 ...

  5. POJ2669不错的最大流 竞赛问题(枚举King的个数)

    题意:       有n个人,任意两个人都比一次赛(一共比了n*(n-1)/2场),赢一场得到一分,最后的时候如果得分最高,或者是自己打败了所有比自己得分都高的人就算是King,给你每个人的最后得分, ...

  6. Linux-鸟菜-7-Linux文件系统-EXT

    Linux-鸟菜-7-Linux文件系统-EXT Linux最传统的磁盘文件系统(filesystem)使用的是EXT2,所以先从EXT2开始了解. /dev/sd[a-p][1-128]  为实体磁 ...

  7. MetInfo Password Reset Poisoning By Host Header Attack

    if we know some user's email, the we will can reset the user's email by host header attack. The atta ...

  8. git中一些常见问题的解决

    1. 解决: 先pull,执行git pull origin 分支名称:然后再执行 git push origin 分支名称 2.git报remote HTTP Basic Access denied ...

  9. HashMap 的数据结构

    目录 content append content HashMap 的数据结构: 数组 + 链表(Java7 之前包括 Java7) 数组 + 链表 + 红黑树(从 Java8 开始) PS:这里的& ...

  10. 并发容器-CopyOnWriteSet

    CopyOnWriteSet 该容器与CopyOnWriteArrayList相似,也是读取时不加锁,任意线程可以读.写入时加锁创建一个新的容器,然后写入新元素. 内部用CopyOnWriteArra ...