我有一个 git repo,里面有一些非常大的二进制文件。我不再需要它们,而且我不关心能够从之前的提交中签出文件。因此,为了减少 repo 大小,我想从历史记录中完全删除二进制文件。
经过网络搜索,我得出结论,我最好的(唯一?)选择是使用git-filter-branch
:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch big_1.zip big_2.zip etc.zip' HEAD
到目前为止,这似乎是一个好方法吗?
假设答案是肯定的,我还有另一个问题要解决。git手册有这个警告:
警告!重写的历史对于所有对象将具有不同的对象名称,并且不会与原始分支收敛。您将无法在原始分支之上轻松推送和分发重写的分支。如果您不知道全部含义,请不要使用此命令,并且无论如何都避免使用它,如果一个简单的单个提交就足以解决您的问题。(有关重写已发布历史的更多信息,请参阅 git-rebase(1) 中的“从上游 REBASE 恢复”部分。)
我们的服务器上有一个远程仓库。每个开发人员都会推入并从中拉出。根据上面的警告(以及我对git-filter-branch
工作原理的理解),我认为我无法git-filter-branch
在本地副本上运行然后推送更改。
所以,我暂时计划通过以下步骤:
- 告诉我所有的开发人员提交、推动和停止工作一段时间。
- 登录到服务器并在中央存储库上运行过滤器。
- 让每个人都删除他们的旧副本并再次从服务器克隆。
这听起来对吗?这是最好的解决方案吗?