我只有分支主和我得到这个错误,每次我尝试“git拉”:

error: Couldn't set refs/remotes/origin/master
From /var/lib/git/xxx/project
 ! a0f80ea..49177a3  master     -> origin/master  (unable to update local ref)

当我执行“git pull origin master”时,我得到:

error: Couldn't set ORIG_HEAD
fatal: Cannot update the ref 'ORIG_HEAD'.

我一直在寻找,却找不到原因


当前回答

我有同样的错误,我从git桌面应用程序拉。所以我尝试从DOS命令窗口更新,并得到相同的问题。

然后我尝试了解决方案“git gc -prune=now” .

git gc——prune=now:这已经解决了我所面临的上述问题。

谢谢。

其他回答

参rm . / /遥控器/产地/主人

这对我很管用!

确保执行git拉取的用户与创建存储库的用户相同。文件权限不正确。

问题

Windows用户经常会遇到这个问题

git pull 

error: cannot lock ref不能更新本地ref

导致

原因a)有多个分支,其 从开头到任意斜杠(或到结尾)的名称只在大小写上有所不同。

Branch name clashing (upper/lower case)
#######################################

# Example 1)
#############################
feature/releasecandidate/fix123
feature/releaseCandidate/improveFeature789
------------------------
               ^
  Identical from beginning up to a slash (here the 2nd one)
  except for the marked letter, where the upper/lower case differs




# Example 2)
#############################
releaseBranch
releasebranch
-------------
       ^
  Identical from beginning to the end
  except for the marked letter

原因b)在linux上也是一个问题:一个分支是另一个分支的前缀,带有斜杠边界:

Prefix with slash-boundary
#######################################

# Example 1) - also a problem on linux
#############################
feature/release2021
feature/release2021/fixIssue07
                   ^
              slash boundary

# Example 2)
#############################
feature/release2022
feature/Release2022/fixIssue99
        ^          ^
  differing case   slash boundary
 (problem on 
   windows)

解决方案

删除原因(参见上面的确切原因)。

# inspect your branches, to see if you have the upper/lower case problem
git ls-remote --heads YOUR-GIT-URL

例如:创建一个分支命名策略,例如全部用小写字母;或者最后一个斜杠前面的字母小写。或者一些智能钩子,可以检测到违规。(但是注意:在原因a)中,问题只在windows上,而不是linux上)。

背景

问题是windows将这些分支(来自示例1和2)存储在.git文件夹中

# inspect the files/folders under
.git/refs/remotes/origin/

原因a)窗口不能区分 大写和小写的区别,所以git在window上疯了。

在原因b中,你不能有一个文件夹(例如feature/release2021/)与文件(feature/release2021)同名。

解决方案

一个短期的解决办法通常是有效的(直到你消除了原因):

git pack-refs --all

# delete the contents of .git/refs/remotes/origin/*  
rm -rf .git/refs/remotes/origin/*

git pull; git pull; git pull   # all good? yes!

我已经删除了分支的本地引用:

git branch -d -r REPO/.git/refs/remotes/origin/BRANCHNAME

然后我就可以取回了。

或者更激进一点

rm -rf REPO/.git/refs/remotes/origin

这个方法每次都有效。

这种情况发生在我使用不区分大小写的文件系统的OSX上。不知何故,另一个开发人员推出了一个名称相同但情况不同的分支:My-Branch vs My-Branch。

我已经检出了My-Branch,并在我做拉取时得到了“无法更新本地ref”的错误,这可能是因为文件系统认为My-Branch == My-Branch。

由于我们使用Github,我可以通过通过Github的GUI删除一个分支来解决这个问题。