Sourcetree/GIT - 拉动时无法锁定 ref/reference 损坏

Sourcetree/GIT - Cannot lock ref/reference broken, when pulling

我和一个同事在同一个分支工作了一个星期,不断pushing/pulling变化,今天突然,我点击'pull'看是否有任何变化我需要拉动但出现错误。

顺便说一句,这是在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 中,它内置了一个终端,但我似乎无法在这里找到解决方案。

多种解决方案都没有完全解决,但我最终还是重新克隆了

已接受的解决方案仅提供了有关 OP 如何解决该问题的详细信息,并不是确定的答案。

为了像我这样从 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 只是为了检查存储库是否健康。


NOTE : The ref file would be of different for others. So make sure you are using the ref file name from the error message that you got.**

我也刚好发生;我别名下的一个 ref 分支已损坏。修复:

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

您可以在 Windows 上使用 rd /s 而不是 rm

以下是我解决问题的详细步骤。您可以选择跳过以下部分步骤:

  1. 我首先在出现问题的本地分支中提交了所有本地更改。
  2. 为我的本地分支创建 git patches
  3. 删除了我的本地分支。
  4. 应用了以下修复
  5. 在 运行 git fetch
  6. 之后检查了远程分支
  7. 已将必要的补丁文件应用到本地分支。

这使得 git 恢复了 ref 文件。在那之后,一切又按预期进行了。

错误文本对我来说略有不同,例如: unable to update local ref it is [hash_code_1] but expected [hash_code_2].

所以命令就像 rm -rf .git/refs/remotes/origin/angular_removal 只帮我抓了一次。然后消息会再次return。

在这种情况下真正帮助永久解决问题的是:

  1. 进入我本地存储库的 .git 子文件夹;
  2. 打开 packed-refs 文件;
  3. 从错误信息中找到分支名称所在的行;
  4. 从这个文件中删除它;
  5. 现在您可以随心所欲地获取或拉取。

注意:这是唯一似乎对某些人有效的解决方案,但也是一个危险的操作,它破坏了某些人的本地存储库。请谨慎使用,自行判断。

以下是为我修复它的步骤:

  1. 删除文件.git/packed_refs
  2. 拉一拉。
  3. 运行 git pack-refs 重新创建 packed_refs 文件。

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

我遇到了类似的问题,但我无法将我的提交从我的本地分支推送到远程分支。查看远程分支下的 sourcetree,我的分支突然不存在了。 我尝试了@Dudar 的回答,但打包参考文件中没有提到该分支。 所以我所做的是:

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

注意:我的分支存在于名为 "feature" 的原始子文件夹中。

 git pull

导致以下错误。

error: cannot lock ref 'refs/remotes/origin/e2e/gb-feedback-test': is at 2962f77c6b4248a82efbd4d3c*******f but expected c3c0af7e310247b4e8dfd94883******5
From https://company.com
 ! c3c0af7e3..2962f77c6  branch-name -> origin/branch-name  (unable to update local ref)

已由

解决
git pull origin master

做一个

git gc --auto 

然后

git pull

在终端中找到项目文件夹

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

TL;DR - 删除本地 git 文件夹并再次克隆 repo

如果 none 的解决方案有效,请删除本地文件夹并从 git 存储库再次克隆该文件夹。

注意:这将删除本地存储库的其他分支。

我可以通过删除 .git/packed-refs 文件中的所有项目来修复此问题。

然后我只是 git 拉入终端以从远程获取所有 references/code。

案例 1:检查来自 git-server 的分支是否重复。

Example: two branchs below are duplicate:

- upper_with_lower
- UPPER_with_lower

---> Let consider removing one of them.

情况2:您推送的分支与其他分支重复。

更新参考

$ git update-ref -d refs/remotes/origin/[branchname]