Git仓库的清理工作

3
我有一个非常大的Subversion仓库(> 200,000个提交),最近我们迁移到了Git。多年来,很多人都会犯一些小错误,比如添加iso或msi软件包,添加不应该添加的文件夹等等…我们通过删除文件/文件夹并提交来清除这些问题。SVN能很好地进行稀疏检出,所以这并不是问题。现在使用Git后,客户端需要拉取整个历史记录,本地克隆现在已经达到50GB,是时候做一些清理了…
是否有一种方法可以从历史记录中删除所有被删除的文件?或者创建一个新的仓库,将存在于最新提交中的所有文件移动到其中?
我尝试过git filter-branch命令,它对我有所帮助。但这只适用于那些我知道路径的文件。
我还使用了git log --diff-filter=D --summary以获取所有删除文件的列表,但有成千上万个…
好吧,在最终,我可以简单地启动一个新的仓库,并将最新的文件复制到其中。然后我将失去历史记录,但可以将原始大型仓库保留为档案仓库,以便在需要查找历史记录时使用。
我真的希望有更好的方法…

这是一个棘手的问题,因为这些文件实际上是历史的一部分。任何排除这些文件的方法都必须重写历史。话虽如此,也许你会想看看git的浅克隆功能:它允许你从git clone命令中排除任意数量的提交。这有效地在你指定的位置修剪提交DAG。我猜应该可以有一个带有完整历史记录的git存储库,以及一个浅克隆的存储库,其中排除了你过去的错误,后者用于新开发,而前者仅用于考古。 - cmaster - reinstate monica
1个回答

0

我发现在迁移到Git之后,实现这一点太困难了。但是在此之前我可以做到。

我做了这个:

svnadmin dump …

创建一个转储文件。
svndumpfilter exclude …

为了排除我不再需要的所有东西。 为了获得包括已删除项目在内的完整存储库列表,我做了以下操作:

svndumpfilter exclude "*" …

很酷的是,svndumpfilter会以有结构的排序输出方式列出所有排除的文件。由于我排除了所有东西,所以我得到了一个完整的目录。
我运行了几次svndumpfilter来删除所有不想要的东西。然后将子版本库重新导入为新版本库,再使用此库迁移到git。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接