摆脱'...并没有指向旧git分支的有效对象'

时间:2011-06-07 12:57:46

标签: git version-control github

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

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

我没有任何其他消息,并且回购工作正常。没有任何操作可以阻止我在其他分支上工作,推动变更,拉动......等等。

我环顾四周,关于如何解决这个问题的指示并不明确。我试图执行git fsck --full,但我没有看到任何错误。只需加载dangling ...条消息。

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

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

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

13 个答案:

答案 0 :(得分:24)

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

git remote prune origin

您还可以通过在实际执行之前添加--dry-run来了解它的用途。

答案 1 :(得分:15)

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

[更新。 AFAIU,我因为使用​​git alternate而遇到了这个问题。说我有回购A,注册为回购B的备用。当我在回购A中创建一个新的分支br,并在回购B中将回购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

答案 2 :(得分:14)

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

我也有这个问题,GitHub支持修复它,我想通过删除refs/heads/t_1140就可以了。

更新:我再次使用另一个分支收到错误,我可以通过运行此命令来修复它:

git push origin :refs/heads/t_ispn982_master

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

remote: warning: Allowing deletion of corrupt ref.

但损坏的分支将被删除

答案 3 :(得分:3)

你说你有:

  

还检查了.git / refs / heads,并且没有引用t_1140

......这非常令人惊讶。我只能看到文件.git/refs/heads/t_1140存在时如何发生此错误。你错了吗?

更正:Charles Bailey在下面指出refs可能已打包,在这种情况下.git/refs/heads

中没有相应的文件

答案 4 :(得分:1)

我在尝试克隆一些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'.

答案 5 :(得分:1)

如果它失败了:

  

错误:无法运行重新包装

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

答案 6 :(得分:1)

对你的分支

进行文本搜索.git目录

使用grepfindstr等内容删除所有实例。

答案 7 :(得分:0)

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

git branch -D <branchName>

答案 8 :(得分:0)

这为我解决了这个问题:

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

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

答案 9 :(得分:0)

我遇到了这个问题,上述建议的任何补救措施均无效。 因此,我编辑了.git / packed-refs并删除了提到不存在的分支的行。 一切突然好起来。

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

答案 10 :(得分:0)

这将清除所有丢失的引用:

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

答案 11 :(得分:0)

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

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

答案 12 :(得分:0)

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