如何恢复过滤存储库中的 HEAD 问题?

How to recover HEAD problems in filtered repository?

通过过滤将我的工作区中的存储库一分为二后,我将它们“裸”克隆到新的源中,然后继续在当前分支上的克隆工作区中正常工作。

几次提交后,我将我的分支合并到 master,然后成功推送了它。 接下来我删除了工作区中过时的分支。

然而,当我也试图摆脱“origin”存储库中过时的分支时,我遇到了这样的问题:

(我希望 git fsck 能识别出那些“死”的分支并清理它们,但显然它没有)

不幸的是,我没有记录确切的命令,但大致是我所做的(基于 Preißel 和 Stachmann 的 Git 一书第 1 版(德语)第 19.1 节中给出的说明):

  1. 备份:git clone --no-hardlinks --bare orig.git backup.git

  2. 删除不需要的文件:git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch ...' --tag-name-filter cat --prune-empty -- --all

  3. 重组:git clone --no-hardlinks --bare backup.git new.git

  4. 删除备份:rm -rf backup.git

  5. 查看 new.git 并继续努力

  6. 删除 new.git 中不需要的过时分支:git branch -d ... 我该如何解决这些问题? Git 使用的版本是 2.26.2。

(此答案基于 René Scharfe 的建议(经作者许可使用))

首先尝试将有效的提交分配给分支名称。

% git branch --force bitmap-generic
fatal: Not a valid object name: 'bitmap-generic'.
% git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (173/173), done.
notice: HEAD points to an unborn branch (bitmap-generic)
...

备份存储库(我使用 cp -rp ...)以防万一你搞砸了。

将一些不存在的提交分配给分支(文件之前不存在;如果存在,则不需要):

% echo aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >refs/heads/bitmap-generic

git branch表示bitmap-generic是当前分支, 因此接下来需要更改:

# HEAD references the current branch
% cat HEAD
ref: refs/heads/bitmap-generic

编辑 HEAD,将 bitmap-generic 替换为 master(或任何不同的分支)。

% git branch --delete --force bitmap-generic
error: Couldn't look up commit object for 'refs/heads/bitmap-generic'

我没想到,但这似乎并不重要(我专注于 分支名称 git 专注于 提交 ID);继续(让 git 开心):

# Re-assign branch "bitmap-generic" to HEAD commit:
% git branch --force bitmap-generic

最终:

% git branch --delete bitmap-generic
Deleted branch bitmap-generic (was 03aa7ca).

之后git fsck就不再抱怨了