gpt4 book ai didi

git - 确定是什么阻止了从 git 中删除提交

转载 作者:太空狗 更新时间:2023-10-29 13:50:02 27 4
gpt4 key购买 nike

我如何确定是什么阻止了通过以下命令从 git 中删除提交?

git reflog expire --expire=now --all

git gc --prune=now

详情

我想从我的克隆中完全删除一个提交(例如,提交哈希 XYZ)。如果以上不是正确的命令(或者如果我的以下任何命令/推论不正确),请告诉我。

我知道 XYZ 在运行上述修剪后仍保留在我的克隆中,因为以下返回日志列表:

git log XYZ

我知道 XYZ 不在任何分支中,因为以下没有任何输出:

git branch --contains XYZ

我认为 XYZ 不在任何存储中,因为以下内容没有输出:

git stash list

XYZ 然而,实际上是在一个存储中,但是一个 git bug 阻止了存储被列出。

最佳答案

如果没有存储并且您已经使引用日志过期,那么假设可以从某个引用访问提交似乎是合理的——但并非所有引用都是分支。

你可以试试这个:

git for-each-ref --format='%(refname)' |xargs -I {} git rev-list {} --format="%H {}" |grep ^<hash>

哪里<hash>是您要删除的提交的 ID。在一个简单的测试中,我跑了

git for-each-ref --format='%(refname)' |xargs -I {} git rev-list {} --format="%H {}" |grep ^80c0ab

得到类似的输出

80c0ab39850d7b3ef4969ab934d834f22959a317 refs/original/refs/heads/master

告诉我,我的目标提交由 refs/original 下的引用保持事件状态- 在这种情况下,由 git filter-branch 创建的预重写“备份引用”


更新 - 根据评论进行一些跟进。

你注意到上面的命令返回了 refs/stash ,但 stash 列表(根据 git stash list )是空的。

事实是, stash 列表使用了一个被严重操纵的 reflog。以及您用来清除引用日志的命令

git reflog expire --expire=now --all

将销毁 key reflog。所以现在 stash命令不知道该做什么,就像没有 stash 一样,但是 stash ref 仍然存在,使最近的存储(或创建该存储的提交可访问的完整提交历史记录)在本地保持事件状态 [1]。

在我看来,这可能是一个错误。默认情况下计划的 reflog 过期离开 stash独自一人(因为......好吧......这个原因)。也许争论的焦点是您明确表示过期所有 reflogs,但我认为“除stash 之外的所有reflogs”将是--all 的更有用的定义。在这种情况下。

好吧,随便吧。

如果你确定你不关心被藏起来的东西

git update-ref -d refs/stash

然后继续清理。


[1]“在本地”是因为,至少在默认情况下,stash不共享。克隆 repo,或将其 refs push 一个空的远程,很可能不会携带有问题的提交。但是,这取决于 git 将发送最小包的假设——据我所知,不能保证这样做。因此,如果您需要提交消失,那么最安全的做法是到达它在本地不存在的位置,然后从那个干净的本地 repo 重建任何远程(等)。

关于git - 确定是什么阻止了从 git 中删除提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52189770/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com