仅将部分 TFS 存储库迁移到 Azure DevOps 上的 Git

Migrate only part of TFS repository to Git on Azure DevOps

我是一家公司的新手,我的老板希望我建立一个合适的 Git 存储库来替换现有的 TFVC 存储库。我的公司有数十种针对各种不同产品的 .NET 解决方案,所有这些解决方案都在一个存储库中,所有这些解决方案都在不同的文件夹中。这些解决方案位于包含整个 repo 的总体文件夹的子文件夹中(有 3 个分支标记为 dev、main 和 master)。

我有两个问题:

1) 如何仅将这些解决方案中的一个放入单个 Git 存储库中,以便迁移到我们新的 Azure DevOps 分支?在这种情况下我应该使用哪些工具? Azure DevOps 本身或 git-tf 或 git tfs 命令行的组合?好的,这是一个 3 个问题。

2) TFS 有三个分支:dev、main 和 master(它们是解决方案文件夹的父级)。如何让这些分支中的一个分支被引入 Git(即,我只想让 Master 被引入)?我必须包括所有分支吗?

所以 2 组问题,但实际上是 5 个负载问题。我很抱歉,但这是一个棘手的情况。提前谢谢你。

我写这篇文章是基于对您策略的假设:

下面的答案有一种来自假设你想要传播 repo-per-sln 方法的味道。 "Is it better for us to get everything into one git repo fast and separate later, or move to git piece by piece?" 是一个真正的问题。我只是 1 次迁移的一部分,它完成了整个工作,协调工作非常重要,因为人们周五使用 TFVC 回家,但周一使用 Git 进来。

我提出来是因为你提到你的老板

wants [you] to set up a proper Git repository to replace the existing TFVC repo

"a proper Git repo"(单数)的使用可能会改变您处理事物的方式,尤其是在 AzDO CI/CD 方面。

关于(我的)答案:

How do I get only one of these solutions into a single Git repository

如果这些解决方案确实是独立的,并且您不依赖于其他解决方案,那么请为您的存储库创建一个您喜欢的名称的目录,并对其进行良好的复制粘贴处理。然后你可以在那里初始化一个 git repo(不要忘记为 VS 项目包含一个好的 .gitignore 文件)并提交初始更改。然后你可以将 AzDO 项目 repo 设置为远程推送。

如果您是 Git 的新手,您可能希望在 AzDO 上初始化存储库并在本地克隆,而不是手动将 AzDO 设置为您在本地创建的存储库的远程。然后您仍然可以使用锤子(阅读:copy/paste)将您的 TFVC 代码放入新的 git 存储库中。

如果解决方案与项目和程序集引用相互依赖,那么您需要认真考虑此处的策略。在我最近的迁移中,我们选择使用 NuGet 包来交付在多个服务或产品之间共享的组件。在这种情况下,您可能希望从共享代码开始。把这些东西放在自己的地方,并实施交付策略是一个很好的起点,它会让您真正了解迁移将要进行的操作。

Which tools should I use in this case?

我倾向于使用 Git Bash 来处理大多数这样的事情,但是 "to each his own"。正如@DanielMann 所提到的,您的工具将由您在历史上真正需要的东西来定义。到目前为止,我在所有迁移中都支持他的意见。 "Let the past be the past." 这次最新的迁移还选择放弃本地 Team City 构建配置,转而支持 SC >> CI >> CD 的纯 AzDO 实施。

2) TFS has three branches: dev, main, and master (which are parents of the solution folders). How do I get just one of these branches to be brought over into Git (ie. I just want Master brought over)? Must I include all branches?

我要颠倒这两个问题的顺序:

Must I include all branches?

没有。 TFVC 跟踪文件,因此每个分支都有自己的文件系统。

2) TFS has three branches: dev, main, and master (which are parents of the solution folders). How do I get just one of these branches to be brought over into Git (ie. I just want Master brought over)?

再次使用锤子。您应该在本地文件系统中创建一个新区域来表示存储库。例如:我的回购容器是 c:/src/ 然后我有代表每个单独回购的目录 c:src/r1/ c:src/r2/ 等。 (注意:我的名字比示例中的名字好得多)。一旦你有了这个,从所需的 TFVC 分支获取最新的并敲定。

可能头痛

确保您可以让其他开发人员停止更改您正在迁移的代码。如果您也在设置 AzDO CI/CD 管道,您最终可能需要对项目进行更改才能使其正常工作。如果开发人员仍在更改您正在处理的源代码,您将希望在 TFVC 中回显您的更改,以便他们在其上进行编写,否则当您尝试将新更改重新写入 git.

第 2 点使迁移更容易。

所以应该没有太大问题,使用类似于的命令:

git tfs clone https://tfs.codeplex.com:443/tfs/Collection $/project/trunk --branches=none

https://github.com/git-tfs/git-tfs/blob/master/doc/usecases/migrate_tfs_to_git.md#fetch-all-the-history-for-just-the-main-branch-ignoring-all-the-other-branches