我打算在存储库中询问这个问题,但这似乎是一个更合适的地方。
我能够使用BFG Repo Cleaner(很棒的工具,谢谢!)将我们的.git
文件夹大小减少超过1GB,就我们的存储库而言,这是一个巨大的成功。我还没有把我的裸克隆推到遥远的地方,因为我担心在理解推动然后不再重新克隆的后果之前提出这些变化。
据我所知,最佳实践表明,当历史以这种方式发生变化时,最佳解决方案是执行新的克隆。但是,我在超过2GB和23k提交的存储库中与超过50人的团队合作,在我们的结构下,跨团队协调可能非常困难。结果,我有一些问题:
再次感谢您创建这样一个方便的工具,并希望我能完成它对我的团队项目有用。在此期间,我将继续试验我的叉子。
答案 0 :(得分:4)
在我们开始讨论之前,让我澄清一下在开发人员的活跃团队的背景下清理Git历史记录的建议流程(无论用于清理的技术是什么 - 是否 BFG Repo-Cleaner 或git filter-branch
):
git filter-branch
的较慢工具),并使用git gc
修剪死对象。mirror
克隆,所有旧分支/标记将被覆盖到新清除历史)那么,对你的问题:
如果我推动这些改变的裁判,后果会是什么? 人们要拉到他们现有的副本而不是创造一个 新鲜克隆?
坏。根据经验,我可以说会有一团糟,人们会感到困惑和沮丧。
具体来说,该人的机器上发生的事情是git pull
命令将旧脏历史记录和新清理历史记录合并在一起,有两个长期不同的历史记录(最初与第一个&#发散) 39;在您的历史中提交脏(在您的情况下是3年前)与一个全新且非常令人困惑的合并提交相结合。用户很少清楚这种情况发生了 - 大多数Git日志可视化工具都不会以一种可能使其显而易见的方式呈现 - 如果您很幸运,用户可能会说出类似&#34的内容;我现在已经获得了每份提交的两份副本,WTF?!" - 但前提是他们确实非常敏锐。
如果该用户稍后进行了一些新的提交,并推回到主存储库,他们会将脏历史记录重新推送到已清理的主存储库,否定您的工作,使您的历史记录再次变脏,并创建一个非常好的混淆了Git历史记录,下次他们从主Git仓库中撤出时,你的所有其他用户都会接触到这些历史记录。
他们是否需要采取其他措施来减轻这些后果 如果这是可行的,那么它们的一部分,或者除了它们之外还有什么呢?
技术上,是的。在实践中,这个过程很复杂,容易出错,如果只有一个用户弄错了,就像以前一样搞砸了。
此时,我们必须弄清楚你为什么要试图躲避这个程序。是因为:
如果您考虑blob,此建议是否会发生变化 被删除的是至少有一年历史的历史 大多三岁?
如果最近发生了不好的事情,并且没有其他用户将其拉出来(因此,在最近几小时或几分钟内),您可能会在其他人拉动之前快速清理主回购中的历史记录。一旦其他人提取脏数据,就需要对其进行消毒,最简单的方法就是删除并重新克隆。
如果多年前犯下了不好的东西,那么所有人都会拥有它,并且所有需要进行消毒。
最后,鉴于新克隆不包括任何未同步的工作 上游,你有关于最好的结转方式的建议吗? 从一个克隆到另一个克隆的未跟踪分支?
处理此问题的推荐方法是确保不会发生。与您的团队沟通,告诉他们将要进行存储库清理,并且他们要做的就是确保他们在开始之前将所有工作都推到主存储库的任何分支上清洁。
如果有人不这样做,他们可以尝试将他们关心的分支机构重新定位到已清理的历史记录中。对于每个feature
分支,例如:
$ git rebase --onto clean-origin/feature unclean-origin/feature feature
...(松散地转换为"接受我的功能分支上的所有提交,我没有在清理之前推送到主回购,并在主要repo的该分支的清理版本之上重播它们。
如果用户出错,或忘记只为一个分支执行此操作,您将返回错误的混合脏/清除历史记录方案。
你了解你的团队,你确定他们都可以完美地执行深奥的Git变基操作吗?如果他们这样做有什么好处呢?毕竟说完了之后,告诉他们删除旧的仓库并重新克隆是不是更容易?