无法锁定引用“refs/remotes/origin/master”。

59

当有更新时,我第一次执行git pull时,总是会收到cannot lock ref 'refs/remotes/origin/master'的错误提示。

完整的控制台日志如下。

D:\code\react-native\expo-multi-screen-starter>git pull
error: cannot lock ref 'refs/remotes/origin/master': is at b2459b4d5af42622cba55f9fe47ccd14fbd879bc but expected 76f11048c866cfe3e6570eaacf90db3cb7732723
From github.com:liudonghua123/expo-multi-screen-starter
 ! 76f1104..b2459b4  master     -> origin/master  (unable to update local ref)

D:\code\react-native\expo-multi-screen-starter>git pull
 App.js                                          | 19 ++++-----
 src/navigation/AuthStack.js                     | 14 +++++++
 src/navigation/RootNavigator.js                 | 22 ++++++++++
 src/navigation/TabNavigator.js                  |  4 +-
 src/screens/AuthLoadingScreen.js                | 35 ++++++++++++++++
 src/screens/HomeScreen.js                       | 19 +++++++++
 src/screens/{LoginScreen.js => SignInScreen.js} | 54 ++++++++++++++++++++++---
 7 files changed, 147 insertions(+), 20 deletions(-)
 create mode 100644 src/navigation/AuthStack.js
 create mode 100644 src/navigation/RootNavigator.js
 create mode 100644 src/screens/AuthLoadingScreen.js
 rename src/screens/{LoginScreen.js => SignInScreen.js} (61%)

D:\code\react-native\expo-multi-screen-starter>

1
这种错误消息通常意味着您的存储库存在某些权限问题。在Windows上可能是什么,我不确定。 - torek
这个答案解释了一些关于Git管理的基本知识,针对反向情况,即本地引用存在阻塞,导致无法创建远程引用,但其中的一些解释仍然具有参考价值:https://dev59.com/Hqfja4cB1Zd3GeqPuVzr#76012255 - NeilG
13个回答

117

您需要使用以下 Git 命令在 Git Bash 中更新引用:

$ git update-ref -d refs/remotes/origin/[locked branch name]

然后使用$git pull命令进行拉取。

[locked branch name]是由于提交ID不匹配而导致错误的分支名称。


4
最终有效的永久性解决方案! - jh95
2
这个解决方案应该有一个星标。它对我很有效! - Kashyap Neeraj
"git remote prune origin" 对我没起作用,但这个命令可以。 - Patric

39

我的错误看起来略有不同:

错误:无法锁定参考 'refs/remotes/origin/releases/branch1': 'refs/remotes/origin/releases'已经存在;无法创建 'refs/remotes/origin/releases/branch1'

![新分支] releases/branch1 -> origin/releases/branch1(无法更新本地链接)。

执行以下命令后,该错误消失了:

git remote prune origin

顺便说一下,TortoiseGit建议她这样做。 但是这个

git update-ref -d refs/remotes/origin/releases/branch1

命令没有起作用。


2
非常感谢,它像奇迹一样起作用了。你是一个救星。 - Alok Ranjan
救命稻草,我的天啊。 - Daisy

17
git remote prune origin

这个命令对我有用。


11

我只需删除 .git/refs/remotes/ 即可修复此问题,然后它就会自动还原。


这个答案对我有用。在尝试其他答案之前,它们都没有起作用。 --> git remote prune origin --> git update-ref -d refs/remotes/origin/releases/branch1 - venugopal
之前 "git remote prune origin" 对我来说是有效的。 但最近不知道为什么对我失效了。这次删除 .git/refs/remotes/ 对我有用。谢谢。 - Alok Ranjan

5
如果您已经在运行 VSCode,则可能需要先关闭它。
如“microsoft/vscode 问题 47141”中所示。

当 git-radar 在后台执行 fetch 并且用户运行 git fetch/pull 时会出现此问题。
Git 有一个 index.lock 来锁定索引,以便您不能通过同时进行的获取来破坏索引。
由于此锁定防止 git 修改索引,因此您的 git 命令失败。

您还可以尝试 git remote prune origin,如此处所述

2
是的,我经常在VSCode的集成终端中运行git pullgit remote prune origin似乎会删除文件夹.git/refs/remotes/origin中远程分支的引用,这个操作安全吗?不会对以后的git pull命令产生影响吗? - Donghua Liu
1
@DonghuaLiu 是的,远程分支将在下一次拉取时返回,这包括一个获取(fetch)操作。 - VonC

3

git remote prune origin

这对我很有效。 我认为这个命令的作用是比较本地和远程仓库之间分支列表的差异,并从本地移除那些在远程仓库中不存在的分支。


我能用的唯一命令 - Fatima

1

在我删除分支后,它能够正常工作。

git push origin --delete <branchName>

1
在我的情况下,我处理的分支是短暂的。因此,最终我将其从远程删除了。
git push origin --delete <branchName>

在我的情况下,我没有权限删除我们仓库中的远程分支。因此,在运行上述命令之前,我需要获得该权限。

0

切换到新分支

git checkout -b new-branch

推送当前远程分支

git push [origin] new-branch

0

我曾经遇到过这个问题,花费了很多时间来解决它。 但是没有任何方法对我有效,我只是从同一个分支创建了一个新的分支,并将代码推送到了新的分支。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接