【问题标题】:Removing unreferenced objects from remote从远程删除未引用的对象
【发布时间】:2021-05-05 07:27:28
【问题描述】:

我想知道远程git repo 是否(或应该)在从本地接收到push 后自动删除未引用的文件对象(以及树),在重新定位本地并跳过一些引入的提交之后这些文件以及这些提交也删除了这些文件。由于这些跳过的提交不再在提交的历史链中,因此远程删除这些对象是合乎逻辑的,因为它们现在不属于历史中的任何提交。这张图可以解释它:

这是rebase --onto之前的历史

* b5b7c142 删除违规文件后 * db759b06 删除了违规文件 * 59a9440a 添加了违规文件 * 933729b1 在添加违规文件之前

在我后悔之前被推到了遥控器。但是这里来尝试修复它......

rebase --onto 933729b1 db759b06

有效地重构提交b5b7c142 after-deleting offending-file

拥有不同的父级:933729b1 before-adding-offending-file 并忽略中间的两个提交。

这是在上面的 rebase 之后的样子:(请注意,第一次提交 SHA1 更改了,因为我们更改了父级)

* 17c95f49 删除违规文件后 | * db759b06 删除了违规文件 | * 59a9440a 添加了违规文件 | / * 933729b1 在添加违规文件之前

并且它在本地的历史记录看起来没问题,并且该文件对象仍然存在于 .git/objects 中,它是仍然存在的一些提交的一部分。现在如果我现在推到遥控器会发生什么?它会在 github 上的 .git/objects 中删除该文件对象,因为它现在不是任何提交/树的一部分吗?如果没有,我该怎么做?

【问题讨论】:

    标签: git github git-rebase git-push


    【解决方案1】:

    GitHub 将来可能会或可能不会删除无法访问的提交和文件。这取决于他们。

    一个普通的日常 Git 存储库(例如,一个由您控制的存储库)通常会在 git gc 运行时完全删除未引用的提交。不过,要做到这一点,首先 所有 引用必须消失。使用git rebase 会故意留下几个引用:

    • HEAD reflog 中有一个条目(可通过 git reflog 查看)。
    • 分支引用日志中有一个条目(可通过git reflog <em>branch</em> 查看)。
    • ORIG_HEAD中有引用。

    最后一个将被保存在ORIG_HEAD 中的前一个HEAD 值的下一个操作覆盖。由于 reflog 条目过期,其他两个最终将被丢弃。每个 reflog 条目都有时间戳,并且在 当前 时间超过添加到条目时间戳的过期时间之前是“活动的”。 git gc 的另一个功能是检查过期条目,并将其删除。到期时间由您控制,默认为 30 天和 90 天。这部分令人困惑(它怎么可能是 both?),但与 GitHub 变体并不真正相关,因为它们不使用这样的 reflog:关键是引用必须真的消失了,这需要时间,这部分对于 GitHub 也是如此。

    一旦引用真的消失了git gc 将丢弃保存不需要的提交和文件的内部对象,假设它们不在 保持包装。保留包是你必须自己创建的东西——Git 本身不会这样做——所以如果你不这样做,你个人不会遇到这种情况。

    你在 GitHub 上遇到的主要问题是你不知道他们什么时候会清理他们的最后一个引用,也不知道他们随后什么时候会运行 git gc 来丢弃该对象—— 另外,他们为拉取请求、问题和其他项目添加了特殊的引用,这可以使对象无限期地保持活动状态。所有这一切的结果是,您无法预测某个文件何时甚至是否会从 GitHub 上消失。

    请注意,您可以联系 GitHub 支持并让他们进行手动清理。当然,到那时,任何数量的人都可以获得这个文件,所以如果其中有任何敏感数据,现在就认为它已经为黑帽黑客社区所熟知。

    【讨论】:

    • 下一个问题与原始问题不同,但我不确定它是否应该是一个单独的线程,因为上面的原始问题加上您的答案将需要在那里解释情况。如果我的远程是来自上游的分支,那么当拉取请求批准然后合并时,GitHub 如何处理未引用的对象?它是否会将所有提交(包括那些无法访问的提交以及未引用的对象)转移到我从中分叉的上游,从而增加上游 repo 的大小?
    • 更新,进一步讨论git prunestackoverflow.com/questions/65988200/…
    • 您的第一个问题(关于 GitHub 如何处理分叉存储库)变得复杂,我认为专有信息:GitHub 没有准确说明他们如何管理所有这些。我很确定,根据我在其他地方读到的其他信息,GitHub 使用 Git 的“替代”代码来真正共享对象和打包访问,但为了使其正常工作,他们必须对这段代码进行一些更改。所有这一切的简短版本是说“我不知道”。 :-) 我现在看看 prune 链接...
    猜你喜欢
    • 2022-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多