【问题标题】:Determine what prevents a commit from being pruned from git确定是什么阻止了从 git 中删除提交
【发布时间】:2019-02-10 20:57:15
【问题描述】:

我如何确定是什么阻止了通过以下命令从 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 实际上是在一个 stash 中,但是一个 git 错误阻止了这个 stash 被列出。

【问题讨论】:

  • 提交是否有与之关联的标签?查看git show-ref 以查看任何参考资料。
  • git show-ref 输出包括XYZ refs/stash,但git stash list 仍然没有输出任何内容...
  • 有趣的是它是“最新的”存储然后...试试git stash clear 看看是否有帮助
  • 修复了它。为什么 git stash list 不输出任何东西,如果有东西在藏匿处?这毫无意义……
  • 我在远程找到的唯一像这样的东西是stackoverflow.com/questions/22076944/…

标签: git git-commit git-reflog git-gc


【解决方案1】:

如果没有 stash 并且您已经过期了 reflog,那么假设提交可以从某些 ref 访问似乎是合理的 - 但并非所有 ref 都是分支。

你可以试试这个:

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

&lt;hash&gt; 是您要删除的提交的 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 创建的预重写“备份引用”


更新 - 基于 cmets 的一些后续。

您注意到上面的命令返回refs/stash,但存储列表(每个git stash list)是空的。

问题是,存储列表使用了经过大量操作的 reflog。还有你用来清除 reflogs 的命令

git reflog expire --expire=now --all

将销毁密钥引用日志。所以现在stash 命令不知道该做什么并且表现得好像没有存储,但是stash ref 仍然存在,保留了最新存储中的任何内容(或从提交时可以访问的完整提交历史记录)该存储是创建的)在本地活着[1]。

可能被视为错误的 IMO。默认情况下,计划的 reflog 到期仅留下 stash (因为......好吧......这个原因)。也许这个论点是你特别说过要使 all reflogs 过期,但我认为“除stash 之外的所有reflogs”在这种情况下将是--all 的更有用的定义。 p>

好吧,随便。

如果你确定你不关心隐藏的任何东西

git update-ref -d refs/stash

然后继续清理。


[1] "alive locally" 因为至少在默认情况下,stash 是不共享的。克隆 repo 或将其 refs 推送到空的遥控器中,很可能不会携带有问题的提交。但是,这取决于 git 将发送最小包的假设 - 并且 AFAIK 不能保证这样做。因此,如果您需要提交消失,那么最安全的做法是达到它在本地不存在的点,然后从该干净的本地 repo 重建任何远程(等)。

【讨论】:

  • 命令输出是XYZ refs/stash,但git stash list 仍然没有输出...
  • @XDR :哦,...我想我知道发生了什么。等我运行一个快速测试...
  • @XDR - 已更新。
猜你喜欢
  • 2020-04-07
  • 2021-02-24
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2016-10-10
  • 2015-09-02
  • 2012-09-10
  • 1970-01-01
相关资源
最近更新 更多