TFS 2010跨团队项目分支 - 最佳实践

问题描述 投票:24回答:5

我在根据TFS Ranger团队提供的最佳实践了解如何配置TFS时遇到了问题。问题是这样的:

我公司有几种产品可以使用共享的公共代码库。

> $/Core
>  -> /Main/Source (Parent Branch)
> 
> $/Product1
>  -> /Main/Source
>  -> /Main/Source/Core/Source (Child Branch from $/Core)
>  -> /Main/Source/...
> 
> $/Product2
>  -> /Main/Source
>  -> /Main/Source/Core/Source (Child Branch from $/Core)
>  -> /Main/Source/...

因此,我们有一个团队集合,并说这个例子有三个团队项目。 ($ / *是一个团队项目)

我们的初始版本分支有点痛苦。我们不是分支/ Main到/ Releases,或/ Main to / Development,而是分别对每个项目进行分支。 (不是团队项目......解决方案项目。)

这是由于无法嵌套分支根。 (参见TFS错误:TF203028 and TF203071

根据TFS游侠指南和我们修订的分支发布,修补程序,开发方法,我们应该从/ Main而不是/ Main / Source / Proj1,/ Proj2,/ Proj3等分支。这只是一个相当大的烦恼。

理想情况下,我们希望:

> $/Product1
> -> /Main/ (Branch - Parent)
> -> /Releases
>    -> /1.x
>       /1 Service Pack (Child Branch from $/Product1/Main
>       -> /1.0
>          -> /1.0 Hotfix (Child Branch from $/Product1/Releases/1.x/1 Service Pack)
>          -> /1.0 RTM (Child Branch from $/Product1/Releases/1.x/1.0/1.0 Hotfix - Read Only)
>          -> /1.0.22 RTM (Child Branch from $/Product1/Releases/1.x/1.0/1.0 Hotfix - Read Only)
>       -> /1.5
>          -> /1.5 Hotfix (Child Branch from $/Product1/Releases/1.x/1 Service Pack)
>          -> /1.5 RTM (Child Branch from $/Product1/Releases/1.x/1.5/1.5 Hotfix - Read Only)

解决方案:1。我们可以将每个共享分支(即$ / Core)转换回常规文件夹。这样,/ Main下的文件夹就不是分支根目录。然后我们可以执行从$ / Product1 / Main / Source / Core / Source到父$ / Core / Source的无基础合并。

有没有任何基础合并的经验。我从微软那里读到的是,它们是不应该是司空见惯的例外。 MS指出,如果使用TFS正确设置项目,则永远不需要执行无基础合并。

在跨团队项目分支时,这怎么可能?!?在任何软件开发公司中,在产品之间共享库应该是司空见惯的。

我也对其他解决方案持开放态度。

谢谢!

tfs tfs2010 shared-libraries branching-and-merging
5个回答
12
投票

我会向戒指扔一个选项,它可能对您有用,也可能没用。如果有任何安慰,我一直在思考这个问题一段时间,而且还没有能够提出一个完全令人满意的解决方案。这是一个非常好的问题,我很想知道别人如何解决这个问题。

我知道尽可能从源代码构建是一个好主意,但我不喜欢团队项目之间的分支。如果你有一些共同的代码,并且需要在2或3个其他团队项目之间进行分支,那么分支是可管理的,但如果你有20或30个(或100个)团队项目,那么管理合并变得令人头疼。如果在使用团队项目中工作的开发人员在“主”中没有相同的权限(例如无法查看历史记录等),则可能存在其他问题。当然,如果您需要在团队项目之间共享代码在不同的项目集合中,你无论如何都不能分支。

因此,考虑到这一点,我建议您以与处理第三方库和使用二进制引用相同的方式处理公共代码。一旦您了解了这种心态,您就可以使用多种选项。 (这里有一些,但可能更多)

  1. 您可以使用公共代码的构建将二进制文件复制到放置位置,以及用于打包的合并模块(如果使用MSI)。然后,您可以创建对放置位置的二进制引用,并获取用于打包的任何内容以导入合并模块。在这种情况下,您需要确保丢弃位置稳定(并且最好只读取大多数开发人员以防止篡改)
  2. 与选项1类似,但使用NuGet之类的工具来管理引用,这将自动引用新版本的二进制文件。
  3. 您可以在分支中检入分支中的$ / Product1 / branch / lib / common文件夹,并使用相对路径引用它们

正如我所说的,我非常有兴趣了解其他SOers如何使用TFS解决共享代码问题。

编辑:经过8年的思考,Nuget包是这里的前进方向。我已经将剩下的答案留在了原地,因为它仍然可以获得观看和推荐。构建对包的依赖关系并将它们存储在二进制存储库(nuget / Nexus / Artifactory / Azure工件等)中几乎是解决此问题的标准方法


6
投票

TFS 2010分支重访:

我想为TFS 2010无基础合并功能提供一种信任模式,作为解决此问题的一种方法。我强烈建议您阅读Wrox一书“Professional Team Foundation Server 2010”。

在其中,它深入描述了这个问题,虽然它并不提倡使用无基础合并,但它揭示了如何在这样的场景中使用它们。

我们一直在使用它们,因为这个问题在4月份首次得到解决,并且还没有遇到无根据合并存在问题的情况。我想按照本书和ALM游侠团队的建议发布一张详细说明我们分支设置的图像。


2
投票

为了达到你想要的效果,你需要先将root下的所有分支转换为文件夹,然后你就可以将root转换为文件夹了。

我们一直坚持在不同的分支下合并,然后我们进行了毫无根据的合并。花了一些时间来弄清楚它是如何工作的,但后来我们成功地进行了跨越分支的合并,然后创建了它们之间的关系。

tf merge /baseless "D:\TFS2010\Root\ServicePack" "D:\TFS2010\Root\MainLine" /recursive

完成baseless merge后,您需要签入所有文件。你仍然会发现分支之间的关系没有创建。

为此,单击ServicePack分支(根据我的示例),然后从文件菜单中单击“源代码管理” - >“分支和合并” - >“重新显示”。在那里,您可以选择重新育儿。一旦完成,因此每当您想要跨这些分支合并时,您将能够像跨分支的正常合并一样。


1
投票

我刚刚配置TFS并遇到了同样的问题。关键是,没有必要进行毫无根据的合并。解决方法:

  1. 创建父分支 $ /核心/主
  2. 创建子分支 $ /产品1 - > /主要 - > / Main / Core - > / Main / ...
  3. 删除子分支文件夹 $ /产品1 /主/核心
  4. 使用SAME名称创建文件夹 $ /产品1 /主/核心
  5. 将Product1文件夹转换为分支 $ /产品1 /主

现在,您可以将$ / Core / Main中的更改合并到$ / Product1 / Main / Core并向后合并。 可视化不适用于Core分支,但我猜是好的;)


0
投票

如果您想共享公共代码,那么您可以尝试以下解决方案:

转到文件 - >源代码管理 - >从源代码管理添加项目...

这将弹出一个对话框,允许您从源控件中的其他位置添加项目。

一旦你开始分享这样的项目,在你的源代码控制结构中获得一点健壮是值得的。

我注意到的一件事是,如果你对公共代码进行了更改,那么它将不会自动检出。所以它类似于引用项目的区别在于它也适用于TFS。

原始的answer

© www.soinside.com 2019 - 2024. All rights reserved.