克隆多个 TFS 存储库的过程

Posted

技术标签:

【中文标题】克隆多个 TFS 存储库的过程【英文标题】:Process to clone multiple TFS repositories 【发布时间】:2021-07-16 12:12:40 【问题描述】:

我们目前正在尝试将一些存储库从 TFS 迁移到 Git。但是我遇到了一些问题,我可以在定义流程时使用一些帮助。

我们有不同的产品,并且在 TFS 中有与这些产品相对应的文件夹。比如Application 1Application 2Product 3等。当我使用git tfs list-remote-branches <tfs url>时:我看到的可以克隆的分支的结果是这样的:

$/Application 1/some folder1/some subfolder1 [*]
|
+- $/Application 1/some folder1/some subfolder1/v.15/DLL files

$/Application 2/some folder2/some subfolder2 [*]
|
+- $/Application 2/some folder2/some subfolder2/v.14/DLL files
|  |  $Application 2/some folder2/some subfolder2/v.20/LayoutDesigns

上面的 sn-p 是我使用git tfs list-remote-branches 命令时得到的结果类型的示例。我可以使用以下方法成功克隆这些存储库:

git tfs clone <tfs url> <repo path> --branches=all

但是,这有一个问题。我正在尝试定义一个过程,让所有这些都变得容易。我知道我可以为此编写一个脚本,并且我正在努力解决这个问题。但我遇到的问题是我无法直接克隆$/Application 1$/Application 2。以上只是一个示例,而实际上我需要克隆更多的分支。按此顺序进行所有操作看起来会非常杂乱无章。

我尝试使用 Visual Studio Source Explorer 中的“转换为分支”并尝试将 $/Application 1 和其他文件夹(Application 2Product 3)转换为分支,但它说分支已经存在,所以它不能转换它。

有没有一种流畅有效的方法可以克隆这些 TFS 存储库并将它们转换为 git?到目前为止,该过程可能会变得非常混乱,因为git tfs clone 会为每个单独的分支创建文件夹。

【问题讨论】:

【参考方案1】:

由于 2 个 VCS 工具之间的差异,将 TFVC 迁移到 git 是一件棘手的事情。

git-tfs 正在尝试提供帮助,但如果您尝试要求它迁移分支,则取决于 TFVC 历史的复杂程度可能无法迁移它。

因为有了 git-tfs,你有两种可能:

    尝试迁移分支 使用“平坦”历史迁移

1。使用分支支持迁移

你需要克隆git tfs list-remote-branches返回的分支之一。

大多数时候,您会想要克隆用[*] 突出显示的那些。

如果我能很好地理解您的问题,您将希望使用所有链接分支(使用 --branches=all )克隆所有顶部分支,即:

git tfs clone <tfs url> "$/Application 1/some folder1/some subfolder1" --branches=all
git tfs clone <tfs url> "$/Application 2/some folder2/some subfolder2" --branches=all
...

如果一切顺利,每个克隆都会为您提供一个 git 存储库,其中包含克隆的分支以及链接到其中的所有其他分支。

例如,对于Application 1,您最终会在 git 存储库中使用 2 个 "pseudo/tfvc" git remote:tfs/default 将对应于克隆的分支,并且每个其他分支都将拥有自己的 "tfvc" 远程

之后,您将能够保持这种状态或尝试将所有“应用程序”存储库与 git 结合起来。

2。使用平坦的历史迁移

使用--branches=none 选项完成。 您可以克隆您想要的 TFVC 文件夹,甚至是根存储库,但它只会获取此范围的历史记录,而不会尝试

这就是前一种方法失败时要做的事情。 结果,您知道有一个 git 历史记录,您可以保留它(但大多数时候它不会真正有用)或尝试使用git 命令(如git subtree)重新创建历史记录。但这远非完美。

你可以在这里找到更多关于 git-tfs 的文档:https://github.com/git-tfs/git-tfs#use-git-tfs

【讨论】:

是的,这就是我希望它们克隆的方式。如果我输入"$/Application 1/some folder1/some subfolder1" 的路径,我最终会得到一个包含内容的“某个子文件夹”,但是,我会丢失之前的路径。总而言之,它提供了一个非常复杂和令人费解的解决方案。我正在努力做到这一点,以便在这种情况下我可以克隆$/Application 1,并克隆与之关联的所有分支。但是,$/Application 1" cannot be cloned as it is not listed with a [*] `.

以上是关于克隆多个 TFS 存储库的过程的主要内容,如果未能解决你的问题,请参考以下文章

带有单独存储库的 git-tf

通过 SQL Server 存储过程调用 Team Foundation Server(TFS) API

当 TFS 为构建克隆 git 存储库时出现 AppDomainUnloadedException

将存储库从VSTS帐户克隆到不同的TFS帐户,并执行提取以进行更新

如何在 Mercurial 中克隆存储库的子文件夹?

通过tfs-nginx进行图片压缩过程