【问题标题】:Getting rid of '... does not point to a valid object' for an old git branch摆脱旧 git 分支的“...不指向有效对象”
【发布时间】:2011-09-10 01:34:28
【问题描述】:

我有一个 Git 存储库的分支,而我的克隆似乎与一个不再存在的旧分支存在问题。我不断看到这条消息:

error: refs/heads/t_1140 does not point to a valid object!

我没有任何其他消息,并且 repo 工作正常。没有任何操作可以阻止我在其他分支上工作、推送更改、拉取......等等。

我环顾四周,没有关于如何解决此问题的明确说明。我试图执行git fsck --full,但我没有看到任何错误。只是dangling ... 消息的负载。

我还检查了我的.git/config,没有对这个分支的引用,还检查了.git/refs/heads,没有对t_1140的引用

知道如何摆脱这个错误吗?

p.s 我试图再次克隆我的 repo,似乎错误也是我的 Github repo。所以,我现在唯一能想到的就是放弃我的回购并再次分叉。

【问题讨论】:

  • 顺便说一句,我遇到了这个错误,例如,推主 git push origin master 并且我确定我在主中:
  • 这变得更糟了,它现在也影响到我新创建的分支,如gist.github.com/1012439 所示。推送新创建的t_1144 分支后,每当我尝试推送另一个分支时,我都会突然收到此分支的错误消息。从那时起,任何与上游仓库同步的尝试都会显示该错误和t_1140 错误:gist.github.com/1012452
  • 我已经擦掉了我的叉子并再次分叉。现在看起来一切都很好。

标签: git version-control github


【解决方案1】:

这将清除所有丢失的参考:

git for-each-ref --format="%(refname)" | while read ref; do
    git show-ref --quiet --verify $ref 2>/dev/null || git update-ref -d $ref
done

【讨论】:

  • 这会安全地删除本地引用,而不会对远程执行任何破坏性操作。删除 --quiet 标志和 2>/dev/null 以获得详细输出也有帮助。
【解决方案2】:

检查.git/refs/remotes/origin。它们在那里,上游不再有它们。清除不再存在的遥控器运行

git remote prune origin

您还可以通过在实际操作之前添加--dry-run 来查看它的效果。

【讨论】:

  • 嗯,那没用。我在那里没有看到对 t_1140 的引用,我仍然有同样的错误。感谢您的帮助!
  • @GalderZamarreño:git show-ref 显示了什么?分支 ref 可能已打包,不一定对应于 .git/refs 下的文件。
  • 修剪对我也不起作用。我所做的是导航到指定的文件夹“.git/refs/remotes/origin”,然后我只是删除了与我的错误消息匹配的文件。这使错误消失了。
  • 这并不能解决 OP 的问题。见stackoverflow.com/a/59162332/2761869
【解决方案3】:

我经常遇到这个错误。 git remote prune origin 对我不起作用。

[更新。 AFAIU,由于使用 git alternate,我遇到了这个问题。假设我有 repo A,注册为 repo B 的备用分支。当我在 repo A 中创建一个新分支 br,并在 repo B 中将 repo A 作为远程获取时,git 将创建一个远程 ref .git/refs/remotes/A /br 用于新分支。当我删除 repo A 中的分支,并在相应的对象被垃圾收集后,我得到“错误:refs/remotes/A/br 没有指向有效对象!” ]

我已经编写了这个脚本(更新以处理打包的引用)来删除悬空的引用(使用Validate if commit exists 中的信息)。

#!/bin/sh

set -e

if [ $# -eq 0 ]; then
    dir="."
else
    dir="$1"
fi

if [ ! -d "$dir" ]; then
    echo "not a dir: $dir"
    exit 1
fi

if [ ! -d "$dir/.git" ]; then
    echo "not a git repo: $dir"
    exit 1
fi

cd "$dir"

files=$(find .git/refs -type f)

for f in $files; do
    id=$(cat "$f")
    if ! git rev-parse --quiet "$id" \
    >/dev/null 2>&1; then
    continue
    fi
    if ! git rev-parse --quiet --verify "$id^{commit}" \
    >/dev/null 2>&1; then
    echo "Removing ref $f with missing commit $id"
    rm "$f"
    fi
done

if [ ! -f .git/packed-refs ]; then
    exit 0
fi

packfiles=$(cat .git/packed-refs \
    | grep -v '#' \
    | awk '{print $2}')

for f in $packfiles; do
    if ! git rev-parse --quiet --verify "$f" \
    >/dev/null 2>&1; then
    continue
    fi
    id=$(git rev-parse "$f")
    if ! git rev-parse --quiet --verify "$id" \
    >/dev/null 2>&1; then
    continue
    fi
    if ! git rev-parse --quiet --verify "$id^{commit}" \
    >/dev/null 2>&1; then
    echo "Removing packed ref $f with missing commit $id"
    git update-ref -d $f
    fi
done

【讨论】:

  • 这个脚本为我解决了这个问题。在我的情况下,我使用git clone --reference path/to/existing/clone.git git@github.com:remote-repo 在多次克隆同一个存储库时通过慢速连接重新使用已经存在的本地克隆。可能一些参考在一个克隆中被删除了,而另一个不知道。
  • 查看 stackoverflow.com/a/59162332/2761869 以了解具有相同功能的 git one-liner。
  • 我遇到了这个问题,因为我不小心断开了硬盘与笔记本电脑的连接。这个脚本解决了这个问题。谢谢!
【解决方案4】:

您的本地克隆可能没问题,问题是您的 GitHub 存储库中缺少 t_1140 分支对象。

我也遇到了这个问题,GitHub 支持解决了这个问题,我想通过删除 refs/heads/t_1140 来解决。

更新:我在另一个分支上再次遇到错误,我可以通过运行以下命令来修复它:

git push origin :refs/heads/t_ispn982_master

您应该会收到如下警告消息:

remote: warning: Allowing deletion of corrupt ref.

但是损坏的分支会被删除

【讨论】:

    【解决方案5】:

    你说你有:

    还检查了 .git/refs/heads 并且没有提及 t_1140

    ...这很令人惊讶。如果文件.git/refs/heads/t_1140 存在,我只能看到这个错误是如何发生的。有没有可能你弄错了?

    更正: Charles Bailey 在下面指出,可能会打包 refs,在这种情况下,.git/refs/heads 中没有相应的文件

    【讨论】:

    • 你永远不应该假设所有的引用都对应于.git/refs中的文件,因为它们可能已经被打包了。使用git show-ref 会更好,它会显示打包和解包的引用。
    • @Charles Bailey:感谢您的更正,我完全忘记了打包裁判。无论如何,我都会不删除它,以防其他人犯同样的错误。
    【解决方案6】:

    我在尝试克隆一些 github 存储库时遇到了这个问题,我所在的系统运行的是旧版本的 git v1.7.4,快速更新修复了它。

    remote: Counting objects: 533, done.
    remote: Compressing objects: 100% (248/248), done.
    remote: Total 533 (delta 232), reused 529 (delta 230)
    Receiving objects: 100% (533/533), 121.36 KiB, done.
    Resolving deltas: 100% (232/232), done.
    error: refs/remotes/origin/master does not point to a valid object!
    verror: Trying to write ref refs/heads/master with nonexistant object 0457f3e2e9432e07a1005f0f4161dc4b8215f128
    fatal: Cannot update the ref 'HEAD'.
    

    【讨论】:

    • 这有什么关系?
    • 它怎么不相关@Buffalo? “我遇到了这个问题”指的是 OP 的问题,我的输出显示了与 OP 所指的相同的错误消息“不指向有效对象!”,我的解决方案是更新 Git 二进制文件。
    • 我在 AWS CodeBuild 中遇到了这个问题:将图像从 aws/codebuild/standard:4.0 更改为 aws/codebuild/standard:5.0 解决了它(Ubuntu 18.04 到 20.04)。
    【解决方案7】:

    如果它失败了:

    错误:无法运行重新打包

    .git/packed-refs 中查找列出的分支并删除这些行。我尝试了所有其他解决方案,但这最终为我解决了。

    【讨论】:

    • 是的,我认为这是问题的实际答案。从 packed-refs 中删除 sha1,或者如果您觉得刹车完全删除 .git/packed-refs。在这一步之后,它需要一个 git fetch
    【解决方案8】:

    在您的 .git 目录中进行文本搜索以查找您的分支

    使用grepfindstr 之类的东西并删除所有实例。

    【讨论】:

    • 这对我有用。编辑了.git/packed-refs.git/info/refs
    【解决方案9】:
    error: refs/heads/t_1140 does not point to a valid object!
    

    假设您已经尝试使用以下方法进行修剪:

    git remote prune origin

    你仍然无法让它工作,作为最后的手段,尝试删除t_1140

    基本上,

    1. cd refs/heads

    2. rm -r t_1140

    【讨论】:

    • 我最终也不得不使用这种方法。我使用了find ./.git -name '*NAME*' 并在结果上使用了 rm。就我而言,它是一个 ./.git/refs/tags 条目。手动删除有问题的项目后,我能够更新我的存储库。
    • 删除标签,它可以工作
    【解决方案10】:

    这为我解决了问题:

    git push origin :refs/remotes/origin/[branch name]
    git push origin :refs/heads/origin/[branch name]
    

    警告:这将从服务器中删除分支 - 该分支上尚未合并到另一个分支的任何更改都将丢失。

    【讨论】:

      【解决方案11】:

      在尝试了各种解决方案后,我终于在 Windows 命令提示符下清理了引用,如下所示:

      for /f %i in ('git for-each-ref --format="%(refname)"') do git show-ref --quiet --verify %i || git update-ref -d %i
      

      【讨论】:

        【解决方案12】:

        我要为使用 Visual Studio 的人提供两分钱。 我在尝试删除本地分支并通过命令行运行以下命令时遇到了这个问题:

        git branch -D <branchName>
        

        【讨论】:

          【解决方案13】:

          我遇到了这个问题,上面建议的补救措施都没有奏效。 所以我编辑了 .git/packed-refs 并删除了提到不存在的分支的行。 一切都突然好了。

          一定会喜欢那些人类可读的文件格式...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-07-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多