我有一个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目录对分支进行文本搜索
使用类似grep
或findstr
的方法并删除所有实例。
这为我修复了它:
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镜像有问题,则可能会出现此问题,请尝试使用其他可用镜像。
- 获取工作镜像链接
- 删除有问题的现有
git远程-v
git删除远程源
- 使用正在工作的更新
git remote add origin <New mirror URL>
无论谁在使用Visual Studio,我都会给他两分钱。我在尝试删除本地分支时遇到了这个问题,并通过命令行运行以下命令解决了这个问题:
git branch -D <branchName>