版本控制 - 摆脱旧 git 分支的'... does not point to a valid object'



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

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我再次尝试克隆我的repo,似乎错误也是我的Github repo。所以,我现在唯一能想到的就是放弃回购,再次分叉。

这将清除任何丢失的引用:

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

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

git remote prune origin

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

我经常遇到这个错误。git远程修剪源对我不起作用。

[Update.AFAIU,由于使用git alternate,我遇到了这个问题。假设我有repo A,注册为repo B的alternate。当我在repo a中创建一个新分支br,并在repo B中以远程方式获取repo a时,git将为新分支创建一个远程引用。git/refs/remotes/a/br。当我删除repo A中的分支时,在相应的对象被垃圾收集后,我会得到"error:refs/remotes/A/br未指向有效对象!"]

我已经编写了这个脚本(更新以处理打包的引用)来删除悬挂的引用(如果存在提交,则使用Validate中的信息)。

#!/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

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

我也遇到了这个问题,GitHub的支持修复了它,我想是通过删除他们端的refs/heads/t_1140

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

git push origin :refs/heads/t_ispn982_master

你应该得到这样的警告信息:

remote: warning: Allowing deletion of corrupt ref.

但是损坏的分支将被删除

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

你说你有:

也检查了.git/refs/heads,没有引用t_1140

这是非常令人惊讶的。只有当文件.git/refs/heads/t_1140存在时,我才能看到这个错误是如何发生的。你可能搞错了吗?

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

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

如果它失败了:

错误:无法运行重新打包

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

在重写历史记录并同时删除许多分支后出现了这个问题。

rm -rf .git/refs/remotes/origin/
git fetch

通过删除所有远程引用并重新获取它们来解决这个问题。

通过.git目录对分支进行文本搜索

使用类似grepfindstr的方法并删除所有实例。

这为我修复了它:

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

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

我遇到了这个问题,上面建议的补救措施都不起作用。因此,我编辑了.git/packed引用,并删除了提到不存在分支的行。突然一切都好了。

我喜欢那些人类可读的文件格式。。。

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

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

除了其他人提到的之外,如果您当前使用的git镜像有问题,则可能会出现此问题,请尝试使用其他可用镜像。

  1. 获取工作镜像链接
  2. 删除有问题的现有

git远程-v

git删除远程源

  1. 使用正在工作的更新
git remote add origin <New mirror URL>

无论谁在使用Visual Studio,我都会给他两分钱。我在尝试删除本地分支时遇到了这个问题,并通过命令行运行以下命令解决了这个问题:

git branch -D <branchName>

相关内容

最新更新