如何恢复过滤存储库中的 HEAD 问题?
How to recover HEAD problems in filtered repository?
通过过滤将我的工作区中的存储库一分为二后,我将它们“裸”克隆到新的源中,然后继续在当前分支上的克隆工作区中正常工作。
几次提交后,我将我的分支合并到 master
,然后成功推送了它。
接下来我删除了工作区中过时的分支。
然而,当我也试图摆脱“origin”存储库中过时的分支时,我遇到了这样的问题:
git branch
列出了由于 fatal: Couldn't look up commit object for HEAD
. 而无法使用 git branch -d
删除的分支
git fsck
抱怨:notice: HEAD points to an unborn branch (bitmap-generic)
(我希望 git fsck
能识别出那些“死”的分支并清理它们,但显然它没有)
不幸的是,我没有记录确切的命令,但大致是我所做的(基于 Preißel 和 Stachmann 的 Git 一书第 1 版(德语)第 19.1 节中给出的说明):
备份:git clone --no-hardlinks --bare orig.git backup.git
删除不需要的文件:git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch ...' --tag-name-filter cat --prune-empty -- --all
重组:git clone --no-hardlinks --bare backup.git new.git
删除备份:rm -rf backup.git
查看 new.git
并继续努力
删除 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
就不再抱怨了
通过过滤将我的工作区中的存储库一分为二后,我将它们“裸”克隆到新的源中,然后继续在当前分支上的克隆工作区中正常工作。
几次提交后,我将我的分支合并到 master
,然后成功推送了它。
接下来我删除了工作区中过时的分支。
然而,当我也试图摆脱“origin”存储库中过时的分支时,我遇到了这样的问题:
git branch
列出了由于fatal: Couldn't look up commit object for HEAD
. 而无法使用 git fsck
抱怨:notice: HEAD points to an unborn branch (bitmap-generic)
git branch -d
删除的分支
(我希望 git fsck
能识别出那些“死”的分支并清理它们,但显然它没有)
不幸的是,我没有记录确切的命令,但大致是我所做的(基于 Preißel 和 Stachmann 的 Git 一书第 1 版(德语)第 19.1 节中给出的说明):
备份:
git clone --no-hardlinks --bare orig.git backup.git
删除不需要的文件:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch ...' --tag-name-filter cat --prune-empty -- --all
重组:
git clone --no-hardlinks --bare backup.git new.git
删除备份:
rm -rf backup.git
查看
new.git
并继续努力删除
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
就不再抱怨了