将一个大型的、不同的 TFS 团队项目迁移到 Git

Migrating a large, divergent TFS Team Project to Git

我有一个大型 TFS 团队项目。

在与 Git-TFS 战斗之后(我们的 TFS 团队项目中有一些时髦的东西)我有一个完整的本地 git 存储库。

它太大了,不适合 BitBucket 1GB 的软限制。

Team 项目包含不同产品的分支。

-- 基础产品(主干)
--- 客户端 A 产品(来自主干)
--- 客户端 B 产品(来自主干)
---- 客户端B功能分支(来自B)
--- 客户 C​​ 项目(来自主干)
---- 客户D项目(来自C)
----- 客户E项目(来自D)

如您所见,在 TFS 中创建分支时我们对自己并不友善。

做一个浅克隆显示任何分支的单个提交大约是 150-200MB。任何给定分支的完整历史记录都不到 1GB

我提议为每个分支做一个 git 回购,并且只推送自分支提交以来的分支历史记录。这意味着没有分支具有共同的祖先,在想要进行跨 TFS 分支合并时强制进行无基础合并。我还建议通过执行积极的 GC 和删除一些大对象来存储一个只读的完整历史回购,这使我可以将所有内容压缩到一个回购中。这至少开启了在未来某个时候进行移植或替换+变基以将 'current' 回购与历史回购结合起来的可能性。

我无法在任何时候干净地削减历史记录(和变基)以在 1GB 限制下提供合理的共同祖先和回购空间。

任何人都可以帮助制定更好的迁移策略吗?

更新 1:这个问题的子文本是...当产品出现分歧时,分支结构有多重要。我们遇到的一个重要问题是分支之间的合并提交关系。如果我 trim 历史,它也会迫使我在某些情况下处理合并提交历史(因为我们已经完成了从一个分支的早期部分到另一个分支的晚期部分的疯狂合并)

更新 2: 我有另一种策略,它省去了所有的合并历史,但保留了原始的父分支祖先。 Git 使用 -c 选项快速克隆 TFS,以在所需时间点创建起点。 Git TFS pull --rebase --all 然后初始化一个下降分支 Git TFS 分支 --init [分支名称] 然后再拉等

这给出了合并提交历史的共同祖先和分配,允许更小的回购,但以合并历史为代价。

如果不知道您的存储库中有什么以及您想要保留什么,就很难回答。

但是如果你有一个大约 100-200MB 的工作目录,你一定有很多二进制文件。

我确定第一步是使用非常好用且易于使用的工具删除所有二进制文件,bfg report cleaner

然后,您将查看您的存储库大小是否仍然存在问题。

Ps:在重写历史之前保留存储库的备份。至少,如果您需要的话,它最终将成为您的只读参考存储库...

编辑:事实上,我在 bitbucket 上搜索了这个限制并找到 this page with 2 very interesting links: How to handle big repositories with git and Reduce repository size