我有一个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回购。所以,我现在唯一能想到的就是放弃我的回购和分叉。
答案 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目录使用grep
或findstr
等内容删除所有实例。
答案 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