git bad object refs/remotes/origin/master | git upstream is gone
目录
有个 git 仓库莫名其妙的出现了 fatal: bad object refs/remotes/origin/master 的错误。
我的问题状况 #
事情起因,是在更新一个 git 仓库时,出了点问题,git 提示我 upstream 不见了,要执行 git branch --unset-upstream
来修复。
zsh ❯ git status
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
当执行 git branch --unset-upstream
,去掉远程跟踪后再 git pull
,得到下面错误提示,
Unpacking objects: 100% (19/19), 6.82 KiB | 6.82 MiB/s, done.
fatal: bad object refs/remotes/origin/master
error: https://github.com/lapce/lapce-plugin-rust did not send all necessary objects
尝试寻找办法 #
通过一翻搜索,看到一个帖子,什么 git symbolic-ref
,git update-ref
这些 git 子命令,难道又要去翻 git 的
命令手册
吗?
Try to find solution
先来根据问题出现时的提示,看是否能找个简单点的办法。
-
cat .git/refs/heads/master
, 得到一个 COMMIT-HASH -
cat .git/refs/remotes/origin/HEAD
, 内容为ref: refs/remotes/origin/master
-
cat .git/refs/remotes/origin/master
, 文件内容为空。可能这个文件.git/refs/remotes/origin/master
就是问题所在。 -
删除掉试试,
rm .git/refs/remotes/origin/master
, 再git pull
得到,a9c3764..02d3a76 master -> origin/master There is no tracking information for the current branch. Please specify which branch you want to merge with. See git-pull(1) for details. git pull <remote> <branch> If you wish to set tracking information for this branch you can do so with: git branch --set-upstream-to=origin/<branch> master
这回的提示是仓库已经更新,但本地的 master 分支没有跟踪远程分支。
-
好了,将远程跟踪设置回去, set-upstream back。
zsh ❯ git branch --set-upstream-to=origin/master master branch 'master' set up to track 'origin/master'.
-
再尝试
git pull
。zsh > git pull Updating a9c3764..02d3a76 Fast-forward .gitignore | 2 ++ Cargo.lock | 55 +++++++++++++++++++------------------------------------ Cargo.toml | 3 +-- README.md | 2 ++ src/main.rs | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------- ... 8 files changed, 88 insertions(+), 67 deletions(-)
问题看似已经解决了。
-
看看那几个在 .git/refs 目录下的文件,有什么变化,发现
.git/refs/remotes/origin/master
和.git/refs/heads/master
都有个相同的 COMMIT-HASH。
总结 #
在我的这个问题中,文件 .git/refs/remotes/origin/master 中的 COMMIT-HASH 不见的,不知道什么原因。把它删除掉,再 git pull
,根据 git 子命令执行后的提示建议操作,很快的就把问题解决掉了。
- 2024/7/7 记
- refs/remotes/origin/master 保存着远程分支对的
COMMIT-HASH
,当内容为空或者所指的COMMIT-HASH错误时,则会出现 bad object 的提示。复制对应本地分支refs/heads/master 的COMMIT-HASH
是一种方法;先删除掉后再git pull
让 git 自我修复是一种方法;当情况是远程分支改名或者不存在(upstream is gone)了,使用git remote set-head origin --auto
修复。当然,平时我们只是使用git来管理代码版本,并非要成为一个git专家,不会过于深入追究问题,可能直接删除掉 refs/remotes/origin/master 然后根据提示来操作可能更节省时间。