大家早上好。
我们有一个历史悠久的TFVC存储库(通过TFS版本15.117.26714.0托管)。从来没有创建过分支,所有的都只是文件夹。当前结构如下:
/project/trunk/application1
/project/trunk/application2
/project/branches/release1/application1
/project/branches/release1/application2
/project/branches/release2/application1
/project/branches/release2/application2
每个版本都有多个bug-fix-commit,因为我们必须为客户维护较旧的版本。第一次提交是从2011年开始,我们将大力推进第100.000个变更集。 目前,我们只是在自己喜欢的地方做出承诺,但是由于团队的成长,成长的痛苦也没有得到改善。
此设置用于多个项目。
我们现在想转向一种更现代的提交方法,例如功能分支,提取请求和易于执行的代码审查。尤其是当前,代码审查非常痛苦,因为我们必须交叉检查每个相关性变更集。
可悲的是,我们发现TFVC无法执行Pull-Request,因此我们想转到git,但我们希望保留提交历史记录。
为了将TFVC存储库转换为git,我们找到了工具git-tfs,使用该工具,我们可以通过转换文件夹主干(版本1和版本2)将每个文件夹转换为单个git存储库(来自上面的草图)进入分支并执行命令:
"C:\Program Files\git-tfs\git-tfs.exe" clone https://dev.azure.com/userName1234/ "{branchName}" . --branches=auto
通过将其他存储库添加为远程存储库,可以很好地看到分支。
但这会导致很多存储库。对于我们来说,最大的项目将是46(!)个存储库。至少可以这样说,这不是很好。这也意味着,根据我们必须为其创建错误修复程序的版本,我们必须更改为另一个存储库,或者从master分支中搜索release分支,这意味着两个工作流仅应是一个。
是否有一种方法可以将所有这些存储库转换为一个存储库,其中主干是主分支,而发行版是该主分支的分支?至少从人的角度来看,它们是可以很好区分的,如下面这种情况的测试设置的屏幕截图所示:
答案 0 :(得分:0)
Git-TFS工具是Team Foundation版本控制和Git之间的双向桥梁,可用于执行迁移。如果您想尝试具有完整历史记录,超过导入工具支持的180天的迁移,或者想要尝试包含多个分支和合并关系的迁移,则Git-TFS是合适的。
但是,正如您提到的,TFVC工作区中没有文件夹,而是所有文件夹。您应该首先为它们选择分支策略。然后将它们转换为Git分支。
在尝试使用Git-TFS进行迁移之前,由于TFVC是集中式版本控制系统,因此Git以与集中式版本控制系统根本不同的方式存储有关文件历史记录和分支的信息。
- Git及时将历史记录存储为存储库的快照,而TFVC记录文件中发生的离散操作。变更
无法表示TFVC中的类型,例如重命名,取消删除和回滚
在Git中;而不是看到文件A被重命名为文件B,您可以
只看到文件A被删除,文件B被添加到同一文件中
提交。- Git没有TFVC标签的直接类似物:标签可以包含任何特定版本的任意数量的文件,并且可以反映 不同版本的文件。尽管在概念上相似,但Git 标签指向整个存储库中某个点的快照 时间。如果您依靠TFVC标签来知道交付了什么,那么Git 标签可能无法提供此信息。
- TFVC中的合并发生在文件级别,而不是整个存储库。您只能合并一个文件中的一部分已更改文件 分支到另一个,然后将其余更改的文件合并到一个 随后的变更集。在Git中,合并会影响整个 存储库,您将无法看到两组单独的更改作为 合并。
由于存在这些差异,我们通常建议用户进行提示迁移,并使其TFVC存储库保持在线状态,但只读以查看历史记录。
这是Microsoft在将Windows和其他产品从集中版本控制迁移到Git时所采用的方法。
对于技巧迁移,请参考官方的TFVC import tool(基于单个分支)。
要使用git-tfs,可以遵循 Daniel Mann的建议,在TFVC中为文件夹建立分支层次结构,以便git-tfs可以将它们视为Git分支。供您参考的命令git tfs xxx branch -init --all
关于如何为文件夹建立分支,您可以看一下我们的官方教程convert a Folder to a Branch。