从 Git 中移除神秘引用

Remove mysterious ref from Git

filter-branch 和 prune/gc 之后,仍然有一些不需要的提交。

它们不在我关心的分支上;上面一定有一些标签或其他东西。

我正在尝试弄清楚那是什么,然后将其删除。

但我似乎没有任何尝试。

$ git name-rev 1bdac1e1ad7ec61a4b05d3f91eb39bde61a4da1f #what's holding on?
1bdac1e1ad7ec61a4b05d3f91eb39bde61a4da1f original/refs/tags/1.0-rc80~1320^2~8^2~1
$ git rm -r refs/original
$ git name-rev 1bdac1e1ad7ec61a4b05d3f91eb39bde61a4da1f
1bdac1e1ad7ec61a4b05d3f91eb39bde61a4da1f original/refs/tags/1.0-rc80~1320^2~8^2~1
$ git update-ref -d original/refs/tags/1.0-rc80
$ git name-rev 1bdac1e1ad7ec61a4b05d3f91eb39bde61a4da1f
1bdac1e1ad7ec61a4b05d3f91eb39bde61a4da1f original/refs/tags/1.0-rc80~1320^2~8^2~1

(这是一个裸仓库。)

我如何删除 original/refs/tags/1.0-rc80,不管它是什么?

全名是refs/original/refs/tags/1.0-rc80,住在refs/original名字里space。您非常接近这个命令:

git update-ref -d original/refs/tags/1.0-rc80

除了 update-ref 要求您拼出全名,refs/original/refs/tags/1.0-rc80

您可能有一些额外的 refs/original/* 名称,因为 git filter-branch 在更改它们之前复制了任何引用名称。您可以通过以下方式查看所有内容:

git for-each-ref refs/original

(你甚至可以使用 for-each-ref 生成命令来删除它们,或者你可以只 rm -rf .git/refs/original 并直接编辑 .git/packed-refs,但是 for-each-ref 方法是更有可能在未来工作 if/when refs 以不同的方式打包,另外你提到这是一个裸仓库所以它们不在 .git 在这里......)。