使用git for-each-ref --format="%(objectname:short) %(refname)"
我得到:
207e698 refs/heads/main
f78d212 refs/original/refs/heads/main
24f61e4 refs/original/refs/tags/Cấutrúc1
4248ddd refs/original/refs/tags/Cấutrúc1.1
207e698 refs/remotes/origin/main
bc5335c refs/tags/Cấutrúc2.0
a03c71f refs/tags/Cấutrúc2.0.1
c72d77c refs/tags/Cấutrúc2.1.0
03f6aa0 refs/tags/Cấutrúc2.2.0
391fcd5 refs/tags/cấutrúc2.3.0
做什么? Remove refs/original/heads/master from git repo after filter-branch --tree-filter?refs/original/
中的答案说:
refs/original/*
可以作为备份,以防您弄乱了过滤器分支。相信我,这真是个好主意。
从评论中,我明白了这不仅是 的备份filter-branch
,而且是一种阻止您使用它的方法。我想前面的引言中“非常好的主意”的意思是不使用 是一个非常好的主意filter-branch
。但这是唯一触发其创建的操作吗?我看到它有各种子路径:refs/heads
、refs/tags
、heads
。他们想说什么?
先说几句:好吧,有一句名言谈到了理解可能产生这种相关问题的思想混乱,如果你解释了是什么促使了这个问题的产生,那么弄清楚是什么导致了这个问题就会容易得多。很可能纯粹是运气好,这件事对我来说不像是无聊的好奇心或某种错误的追寻,所以我做了一些挖掘。真的:当你问同一个情况引发的多个问题时(这根本不是坏事),把它们联系起来并解释情况。
你进行了一些历史记录重写,包括过滤分支,然后看起来你进行了重新定基或者只是放弃了一个分支,这个序列将产生促使你提出的我链接的另一个问题的症状:
而且日志输出令人困惑。我甚至将其称为 的一个缺陷
git log
,该缺陷尚未修复,可能是因为很少遇到,很容易克服,而简单的修复方法也有自己的问题。显示
git log
通常隐藏的细节。为管理引用添加装饰很容易变得非常烦人,在这里这是明智的,甚至是必要的,但情况并非总是如此;并且使用“排除边界标记”功能标记根提交与其他选项的交互甚至更糟糕git log
,我对我想象中的当天持有的观点深表同情:最好不要打开那个潘多拉魔盒,只需在人们感到困惑时展示正在发生的事情。refs/original/
ref 前缀用于git filter-branch
记住重写之前的历史。如果您很懒,在修复损坏可能代价高昂的存储库中执行此操作,git fetch -u . +refs/original/*:*
则会将其重写的每个 ref 恢复为筛选分支之前的状态,您的历史记录将回到原来的位置,自筛选分支以来的任何工作树和索引更改都会保留,您可以使用它们做任何适合您的事情。花点时间看看这里发生了什么,运行这里的例子。Git 不会从存储库中删除历史记录,除非它很长一段时间没有被引用,两周到一个月,具体取决于它是如何被放弃的,这是出厂默认设置。过滤分支可以进行大规模更改。这种
refs/original
速度使得短期内退出变得容易,直到您明确决定您真的不需要它为止。git log
的默认显示简化隐藏了会妨碍的事情,用其现有设施显示它们会造成混淆甚至容易出错。你遇到了它通常的启发式方法的主要缺点,你真幸运。