使用 git-tfs 将 TFVS 迁移到 GIT

85次阅读
没有评论

问题描述

有一个大型的 TFS 代码库,希望将其迁移到 Git。他们考虑使用 git-tfs,在迁移过程中保持一切正常运行。他们的代码库中散布着大量(或少量但快速变化)的二进制文件,这些文件在历史中都已经被检入到 TFS 中。用户对 git-tfs 的一些问题没有找到明确的答案:
1. git-tfs 的真实数据源是什么?是 Git 服务器、TFS 服务器、还是混合的,或者都不是?
2. 如果是 Git 服务器,那么在知道存在二进制文件的情况下,这会如何影响工作流程?
3. 我们考虑使用 LFS,但不确定这会如何与 git-tfs 兼容。

用户希望能够对这个问题有所了解,因为如果迁移后发现二进制文件导致新的代码库无法使用,那将是相当无意义的。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

从 Azure DevOps Server 2019 开始,从 Team Foundation Version Control (TFVC) 迁移到 Git 是一个简单的导入命令。然而,由于 Git 在存储更改的方式上与 TFVC 非常不同,所以在迁移过程中有一些注意事项。
Microsoft 在这个迁移过程中有一个很好的说明文档。如果你使用的是较新版本的 Azure DevOps Server,或者你在云端使用,你不需要使用 git-tfs。
以下是一些要点:
1. Git 是分布式版本控制,这意味着你可以通过克隆存储库到你的机器上,获得文件和所有历史更改的完整副本。实际上,你不需要服务器,但如果你有一个团队并进行协作,你需要一个服务器来通过适当的 Git 工作流和分支与团队共享更改。
2. Git 在存储文本文件方面非常出色,每个提交只存储文件的差异快照,而不是文件的完整副本。而对于二进制文件,需要为每个更改文件存储完整的文件副本。
3. 当需要在 Git 存储库中存储二进制文件时,最好使用 Git LFS(Large File System)。这允许你将文件标记为大型/二进制文件,Git 只会跟踪对文件的引用,而不是实际的文件本身。这样可以保持存储库的小巧和灵活。
4. 当你有一个庞大的存储库(文件/历史记录)大小在 2-4 GB 范围内时,你可能需要使用 Microsoft 贡献的 Virtual File System for Git。Microsoft 在其庞大的 500 GB Windows 代码库中使用了这个工具,全球各地的开发人员都在使用它。Microsoft 和开源社区的贡献者们在为更大的存储库调优 Git 命令方面做得非常出色,但对于无法保持小巧的存储库来说,VFS for Git 是一个重要的进步。
如果你仍在使用旧版本的 TFS,没有简单的导入选项,那也没关系。使用 git-tfs 是一个可行的解决方案,Microsoft 也有一个很好的说明文档,介绍了如何进行手动迁移。无论哪种情况,如果你在 TFVC 中存储了许多二进制文件,与文本/代码相比,你的代码库可能需要进行一些工作。
git-tfs 实际上是通过回放历史并创建 Git 提交,创建了你的 TFVC 存储库的历史克隆到本地 Git 存储库。这个工具可以用作连接 TFVC 存储库和 Git 存储库的方式,但最好是完全迁移到 Git,并删除 TFVC 存储库。
一旦你决定完全迁移,最好在将其推送到 TFS 服务器作为源之前,在新克隆的 Git 存储库中的几个步骤中进行迁移。这样可以清理可能需要的任何二进制文件的历史记录。可以使用 BFG Repo-Cleaner 来实现这一点,它可以重写 Git 存储库中的历史记录,删除除了二进制文件的最新更改之外的所有内容,从而减小磁盘上 Git 存储库的物理大小。

方案2

使用 git-svn 进行回答:
1. 真实数据源是两个存储库。git-* 的目的是在迁移过程中在两个存储库之间进行协调,而不会在任一存储库中创建不一致性。在整个团队决定迁移之前,你不需要一个 “Git 服务器”,因为 Git 在每个存储库的每个副本中都存储了所有的历史记录。
2. 所有文件都是二进制的。Git 可以处理文件。因此,Git 可以处理二进制文件。你可能听说过的是,如果你在源代码控制中有大量的文件(文件数量或数据量),那么很可能出现了一些问题,Git 在某些罕见情况下可能比集中式版本控制慢一些。
我的建议是尝试一下。使用 git-tfs 创建你的 TFS 存储库的本地副本,并在不将更改推送到 TFS 服务器的情况下对 Git 存储库进行测试。如果遇到任何具体的问题,可以提出单独的问题。

附注

  1. 对不起,我给你的回答点了个踩,但并不是所有的文件都是二进制的。Git 可以处理文本和二进制文件,但对于二进制文件,Git 需要为每个更改的文件存储完整的副本,因为它们无法进行差异比较。Git LFS 可以帮助减小存储库的大小,通过将实际的二进制文件与引用分开存储,只保留对它的引用。2. 从非常基本的层面上来说,所有的文件都是二进制的,但你说得对,Git 在存储它们的方式上有所不同。
正文完