Git远程切换推送旧对象

时间:2017-10-27 17:56:02

标签: git git-remote

以下是一种情况。

托管在某个git服务提供商(例如Bitbucket)上的项目源代码。 - 尺寸超过1GB 我们将所有工作迁移到新的git服务提供程序,并进行一些修剪以删除旧的大文件和对象(例如Github) - 大小为500MB。

过渡几周以来。突然之间,回购大小超过1.8GB,看到我们有一些旧的对象被删除作为旧回购的一部分。

现在我如何找到导致此问题的提交/推送?我知道它何时发生,但无法查明可能导致此问题的提交或分支。还有一种更简单的方法来恢复推动以使回购尺寸恢复正常吗?

另一个问题是,如何防止这些物体被意外再次推回?

我的搜索使我得到了相关答案,但空手而归。

参考文献:

How to find/identify large files/commits in Git history?

Which commit has this blob?

1 个答案:

答案 0 :(得分:0)

Git非常注重向数据库添加新东西(提交及其底层对象)的想法,而不会删除任何旧东西。

当你设法删除一些旧的东西时,如果Git再次遇到它们,它会将它们视为 new 的东西并将它们重新添加。你如果你愿意,可以将此视为“重新感染”。 具有“感染”的存储库的每个副本都是“具有传染性”,触摸其中任何一个(通过git fetchgit push)都可以带回您认为对象的对象已经摆脱了。

  

现在如何找到导致此问题的提交/推送?

找到导致它的特定提取或推送很难不可能。查找包含大对象的提交是可能的;查看您链接的答案以及其中的其他链接。

  

还有一种更简单的方法可以恢复推送以使回购尺寸恢复正常吗?

您必须抛弃包含大对象的提交,并且如果您希望保留的提交依赖于那些早期提交,则将后面的提交复制到不再依赖于新提交的新提交。早些时候提交。这就是git filter-branch的作用。一旦你没有指向或拥有其提交祖先链的分支提示,那么拥有大对象的提交就可以重新打包并收缩存储库。

The BFG Cleaner更容易使用(它为您完成所有这些),但我从未使用过它。

  

...如何防止这些物体被意外地再次推回?

这比较棘手。有许多方法在不同程度上起作用:

  • 每个人都在自我约束。在推动之前,推动每个人必须确保他们不会重新引入不需要的大型物体。显然,这只能在人们锻炼的范围内起作用。
  • 限制允许推送的人员数量。这可以将上述问题减少给少数人。
  • 使用Git挂钩验证请求的更新是否不会引入任何任何大对象,或任何特定的(哈希ID已知)以前的大对象。这要求您能够在Git服务提供程序上安装和维护挂钩。如果该提供程序是GitHub,则不能执行此操作,但它们已包含“拒绝大对象”挂钩,因此您无法