跳到主要内容
  1. Blog/

git bad object refs/remotes/origin/master | git upstream is gone

··字数 823·2 分钟
git howto

有个 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-refgit update-ref 这些 git 子命令,难道又要去翻 git 的 命令手册 吗?

Try to find solution

先来根据问题出现时的提示,看是否能找个简单点的办法。

  1. cat .git/refs/heads/master, 得到一个 COMMIT-HASH

  2. cat .git/refs/remotes/origin/HEAD, 内容为 ref: refs/remotes/origin/master

  3. cat .git/refs/remotes/origin/master, 文件内容为空。可能这个文件 .git/refs/remotes/origin/master 就是问题所在。

  4. 删除掉试试, 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 分支没有跟踪远程分支。

  5. 好了,将远程跟踪设置回去, set-upstream back。

    zsh ❯ git branch --set-upstream-to=origin/master master
    branch 'master' set up to track 'origin/master'.
    
  6. 再尝试 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(-)
    

    问题看似已经解决了。

  7. 看看那几个在 .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/masterCOMMIT-HASH是一种方法;先删除掉后再 git pull 让 git 自我修复是一种方法;当情况是远程分支改名或者不存在(upstream is gone)了,使用git remote set-head origin --auto修复。当然,平时我们只是使用git来管理代码版本,并非要成为一个git专家,不会过于深入追究问题,可能直接删除掉 refs/remotes/origin/master 然后根据提示来操作可能更节省时间。