Sourcetree/GIT - 当拉取时无法锁定引用/参考已损坏

35

我和一个同事在同一分支上工作了一个星期,不断地推送/拉取更改,突然今天我点击“拉取”查看是否有需要拉取的更改时,出现了一个错误。

顺便说一下,这是在sourcetree中发生的。错误信息如下:

git -c diff.mnemonicprefix=false -c core.quotepath=false fetch origin
error: cannot lock ref 'refs/remotes/origin/angular_removal': unable to resolve reference 'refs/remotes/origin/angular_removal': reference broken
From https://bitbucket.org/colossus
 ! [new branch]        angular_removal -> origin/angular_removal  (unable to update local ref)

我正在使用Sourcetree,它内置了一个终端,但似乎我找不到解决方法。


打开终端并输入 git for-each-ref;您会得到一个 fatal: missing object 0000000000000000000000000000000000000000 for refs/remotes/origin/angular_removal 吗? - msanford
尝试使用此链接 https://gist.github.com/libitte/cbde168d26bc5faf9bf9fef648091b42,然后查看此链接 https://dev59.com/AGAg5IYBdhLWcg3wS5eC。 - msanford
嗯,还是没有运气。即使我修剪了,我仍然会遇到错误。 - Geoff_S
如果我运行git gc --prune=now,我会得到以下错误信息:error: bad ref for .git/logs/refs/remotes/origin/angular_removal fatal: bad object refs/remotes/origin/angular_removal error: failed to run repack - Geoff_S
git fsck --full 会输出什么信息? - msanford
显示剩余3条评论
13个回答

54

这个被接受的解决方案只提供了如何规避问题的详细信息,它并不是一个确定性的答案。

为了像我这样通过Google到达这里的人,这是真正有效的解决方案。

假设错误信息看起来像下面这样:

error: cannot lock ref 'refs/remotes/origin/angular_removal': unable to resolve reference 'refs/remotes/origin/angular_removal': reference broken

这里,问题出在名为 refs/remotes/origin/angular_removal 的损坏文件,它位于隐藏文件夹 .git 中。

为了解决这个问题,在您的仓库根目录下运行以下命令。

rm .git/refs/remotes/origin/angular_removal
git fsck

第一个命令本身应该可以解决问题,因为git会尝试重新初始化丢失的引用。

git fsck命令是为了检查仓库是否健康。


注意:对于其他人来说,ref文件可能不同。所以确保你使用了你收到的错误信息中的ref文件名。


3
这是真正的答案。按照步骤操作并执行一次获取操作后,我已成功使其工作。 - Kay
这个解决方案对我很有效。我遇到了与 OP 完全相同的错误,而这个解决方案非常好用。尽管我还多执行了一步: 在按照上述步骤操作后,我从.git\FETCH_HEAD中删除了对应有问题分支的条目(对于 OP 来说是 origin/angular_removal),然后 fetch 就可以正常工作了。不确定是否需要这个额外的步骤... - Himanshu
1
FETCH_HEAD 是一种跟踪文件,用于通知 Git 已经提取到哪个分支的哪个提交。该文件会在 git fetch 时自动刷新。最好不要更改这个文件。 - Raja Anbazhagan
起初它是可以正常运行的,但第二次更新项目后,我收到了相同的错误。 - sia

50

对我来说,错误信息略有不同,类似于:无法更新本地引用,它是[hash_code_1],但期望的是[hash_code_2]

因此,像rm -rf .git/refs/remotes/origin/angular_removal这样的命令只帮助我进行了一次提取操作。然后这个消息会再次出现。

实际上,在这种情况下永久修复问题的方法是:

  1. 进入本地存储库的.git子文件夹;
  2. 打开packed-refs文件;
  3. 找到包含错误消息中分支名称的那行;
  4. 从该文件中删除该行;
  5. 现在您可以随意执行提取或拉取操作。

17

注意:这是唯一似乎适用于某些人的解决方案,但也是一个危险的操作,可能会破坏一些人的本地存储库。请小心使用,并根据自己的判断进行操作。

以下是为我修复问题的步骤:

  1. 删除文件.git/packed_refs
  2. 执行pull命令。
  3. 运行git pack-refs命令重新创建packed_refs文件。

参考链接:https://git-scm.com/docs/git-pack-refs


2
这是解决我的问题的解决方案。所有其他的解决方案都没有帮助到我。 - Sagie
1
那让我彻底崩溃了。 - Paul T.
请不要删除这个文件,否则你可能会有麻烦。 - ashForIos
@ashForlos:怎么会呢?我个人不太清楚这里的复杂情况,但这对我有用,所以我想分享一下。 - Lucas Castro
2
@LucasCastro,我刚刚发布了答案,这对我很有帮助。 - Paul T.
1
谢谢!这个对我有用,其他的都不行。 - balajimc55

4

我能够通过删除.git/packed-refs文件中的所有项目来解决这个问题。

然后我只需要在终端上执行git pull以获取来自远程的所有引用/代码。


3

我遇到了类似的问题,但我无法将本地分支的提交推送到远程分支。在sourcetree中查看我的远程分支时,我的分支突然不存在了。

我尝试了@Dudar的答案,但是这个分支在packed-refs文件中并没有提到。

所以我做的是:

  1. 进入我的本地存储库的.git\refs\remotes\origin\feature子文件夹;
  2. 删除名为导致问题的我的分支的文件;
  3. 推送我的更改

注意:我的分支存在于名为“feature”的origin子文件夹中。


3

我也遇到了同样的问题,我的别名下的一个引用分支被损坏了。修复方法:

rm <root of repository>.git/refs/remotes/origin/<your alias>
git fetch

你可以在Windows上使用rd /s代替rm
以下是我解决这个问题的详细步骤。你可以选择跳过下面的某些步骤:
  1. 首先,我提交了我在本地分支中所做的所有更改。
  2. 为我的本地分支创建了git补丁
  3. 删除了我的本地分支。
  4. 应用了以下修复方法。
  5. 在运行git fetch后检出了远程分支。
  6. 将必要的补丁文件应用到本地分支。
这使得Git恢复了ref文件。之后一切都像预期的那样工作了。

3

有多种解决方案都无法完全解决问题,但最终我重新克隆了。


2

在终端中定位到项目文件夹

git gc --prune=now
rm -rf .git/refs/remotes/origin

1
更新参考文献。
$ git update-ref -d refs/remotes/origin/[branchname]

0

情况一:检查来自 git 服务器的分支是否重复。

Example: two branchs below are duplicate:

- upper_with_lower
- UPPER_with_lower

---> Let consider removing one of them.

案例2:您正在推送的分支与其他分支重复。

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