【问题标题】:Sourcetree/GIT - Cannot lock ref/reference broken, when pullingSourcetree / GIT - 拉动时无法锁定参考/参考损坏
【发布时间】:2018-04-23 21:02:40
【问题描述】:

我和一位同事在同一个分支上工作了一周,不断推动/拉动更改,今天突然间,我点击“拉动”以查看是否需要拉动任何更改,然后我出错了。

顺便说一句,这是在 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吗?
  • 我得到的 angular_removal 是这样的:warning: ignoring broken ref refs/remotes/origin/angular_removal a7fc93bf2e87e7e176f286449a332cb881ea40c5 commit refs/heads/angular_removal
  • 嗯还是没有运气。即使当我修剪时,我也会出现错误
  • @msanford 如果我运行 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

标签: git atlassian-sourcetree git-pull


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    为了像我这样最终从谷歌来到这里的人,这里是真正有效的解决方案。

    假设错误消息如下所示,

    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 文件名。**

    【讨论】:

    • 这才是真正的答案。执行这些步骤并在之后获取它我已经开始工作了
    • 这个解决方案对我有用。作为 OP,我得到了确切的错误,这个解决方案效果很好。虽然我执行了一个额外的步骤:按照上述步骤 我从.git\FETCH_HEAD 中删除了与故障分支相对应的条目(对于 OP,它是 origin/angular_removal),然后获取工作。不确定是否需要额外的步骤...
    • FETCH_HEAD 是一种跟踪文件,用于通知 git 提取哪个分支直到哪个提交...该文件将在git fetch 上自动刷新。理想情况下,最好不要修改此文件。
    • 它一开始工作,然后当第二次更新项目时,我得到了同样的错误
    【解决方案3】:

    我也遇到过;我的别名下的 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. 将必要的补丁文件应用到本地分支。

    这使得 git 恢复了 ref 文件。之后一切都按预期工作了。

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

        • 这是解决我自己情况的解决方案。所有其他解决方案都没有帮助。
        • 为我毁了一切
        • 请不要删除此文件,您可能会遇到麻烦。
        • @LucasCastro 我刚刚发布了对我有帮助的答案
        • 谢谢!这对我有用,其他的都没有
        【解决方案6】:

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

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

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

        【讨论】:

          【解决方案7】:
           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
          

          【讨论】:

            【解决方案8】:

            做一个

            git gc --auto 
            

            然后做

            git pull
            

            【讨论】:

              【解决方案9】:

              在终端中找到项目文件夹

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

              【讨论】:

                【解决方案10】:

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

                如果所有解决方案都不起作用,请删除本地文件夹并从 git repo 中再次克隆该文件夹。

                注意:这将删除本地 repo 的其他分支。

                【讨论】:

                  【解决方案11】:

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

                  然后我只是做了一个 git pull in 终端来从远程获取所有引用/代码。

                  【讨论】:

                    【解决方案12】:

                    案例 1:让我们从 git-server 检查分支是否重复。

                    Example: two branchs below are duplicate:
                    
                    - upper_with_lower
                    - UPPER_with_lower
                    
                    ---> Let consider removing one of them.
                    

                    案例2:你推送的分支与其他分支重复。

                    【讨论】:

                      【解决方案13】:

                      更新参考。

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

                      【讨论】:

                        猜你喜欢
                        • 2020-09-21
                        • 2021-09-27
                        • 2017-12-21
                        • 1970-01-01
                        • 2018-04-13
                        • 2016-08-27
                        • 2018-01-23
                        • 1970-01-01
                        • 2021-05-02
                        相关资源
                        最近更新 更多