【问题标题】:How to remove AND free space for file in git repository, from most recent pushed commit?如何从最近推送的提交中删除和释放 git 存储库中的文件空间?
【发布时间】:2021-03-01 05:18:24
【问题描述】:

我最近推送了一个上游分支,该分支意外添加到了我们不希望在存储库中的大文件中。我想删除它。

这是添加此文件的最新推送,并且不在 master 分支上。它只是一个最近创建的分支,只有一次提交。

我在其他来源中查看了之前关于此的 SO 问题,但不清楚我能做什么:

  • This answer 暗示仅使用 filter-tree 实际上不会释放存储库中的空间,这就是我要删除大文件的全部原因。
  • 上述答案还建议删除-blob,我无法访问。我被普通的 git 操作所困扰,而不是扩展或其他。
  • this 这样的其他站点建议如果它已经被推送,filter-branch 可能甚至无法工作?我什至不知道如何解释如何在这里使用--force-with-lease
  • 从很多这些答案中也不清楚我是否需​​要指定某种文件路径,或者它是否会从存储库中的任何位置擦除该文件的任何实例。

是否会将此提交中的更改挑选到新分支作为未暂存的更改、删除文件、将分支推送到上游并在本地删除旧分支并将删除向上推送,可能会解决此问题吗?

【问题讨论】:

  • 1.删除提交。 2. 从 reflog 中删除提交/清除 reflog。 3. 让 git gc 努力工作。
  • 如果提交已被推送,如何删除?如何从 reflog 中删除它或清除 reflog?如何让 GC 做它需要做的任何事情?
  • 如果 blob 不再被任何提交引用,GC 最终会自行删除它。
  • 修改提交会创建一个新的、已更改的提交并删除对原始提交的引用(即它替换原始提交)。

标签: git


【解决方案1】:

关心的是如何释放磁盘空间。这可能意味着本地、远程和/或远程的其他克隆。

一般来说,要释放任何 repo 上的磁盘空间,您需要 (1) 删除 所有 可以访问您要删除的文件的引用,以及 (2) 导致(或等待)垃圾要运行的集合。

在本地,您绝对有足够的控制权来做到这一点。由于它是单提交分支,因此修改提交应该足以消除分支访问文件的能力。您还必须取消“了解”文件的 reflog 条目(包括分支的日志和 HEAD reflog)(请参阅 git reflog expire ; https://git-scm.com/docs/git-reflog)。

通常,您还必须清理可能引用该提交的任何其他引用。这可能包括从该提交创建的其他分支,或标签,或各种其他不太常见的东西。 听起来你说这些都不存在,但请注意,任何 ref 都会阻止 gc 删除文件。如果您不确定,那么在删除分支之前,您可以执行类似的操作

git for-each-ref --contains <branch-name>

(您也可以使用提交 ID 代替 &lt;branch-name&gt;。)

一旦你认为你已经删除了所有可以到达提交的 ref,你可以尝试使用git fsck 来查看它的 ID 是否弹出为“dangling”——这是你所期望的。如果没有,那么你需要弄清楚你错过了什么。

最后,您可以使用git gc - 请参阅https://git-scm.com/docs/git-gc - 来释放原始提交(以及大文件)的实际存储空间。

现在,您可能无法在遥控器上执行部分或全部这些步骤。最常见的问题是无法控制gc 在遥控器上的处理方式。您可以做的最好的事情可能是删除包含该文件的所有引用,然后希望gc 最终能够访问该文件。或者,如果这是不可接受的,您也许可以重新创建遥控器。

无论如何,尽早更新分支可能是明智之举,以免其他人获取文件。 AFAIK,您实际上不能保证遥控器不会向他们发送文件,但您至少可以不给它任何理由。一旦你认为这已经完成,你可以通过创建一个新的远程克隆并查看它是否传递了有问题的文件来进行测试(也许通过再次使用 git fsck 查找未引用的对象,或者只是通过比较 repo 大小)。

【讨论】:

  • 您如何建议我在删除之前从该提交/分支中获取我想要保留的更改?如果我理解正确,这基本上归结为只是在本地删除分支并推动删除,对吗? (我怀疑我能否在遥控器上手动运行 gc)
  • “由于它是一个单提交分支,修改提交应该足以消除分支访问文件的能力。”你签出分支,删除文件,然后git commit --amend
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 2023-04-06
  • 1970-01-01
  • 2019-10-10
  • 2012-08-31
  • 1970-01-01
相关资源
最近更新 更多