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

26
我有困难理解如何按照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到/Development上进行分支,而是分别对每个项目进行了分支。(不是团队项目...解决方案项目。)
这是由于无法具有嵌套分支根的能力所致。(请参见TFS错误:TF203028和TF203071)
根据TFS Ranger Guide和我们修订后的分支发行、热修复、开发方法,我们应该从/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。
有人有过基准合并的经验吗?我从微软那里了解到它们是例外情况,不应成为常规操作。微软指出,如果您使用 TFS 正确设置项目,则永远不需要执行基准合并。
但是,在跨团队项目时如何做到这一点呢?在任何软件开发公司中,共享库在产品之间很常见。
我也欢迎其他解决方案。
谢谢!

这里有别人遇到同样问题的链接:http://social.msdn.microsoft.com/Forums/en-US/tfsversioncontrol/thread/a2f1b3bb-337f-4abe-abed-04c367523eaf - Daniel
这个问题的答案似乎是主观的。微软TFS Ranger团队在这个话题上没有提供足够的信息或解释。我很难授予赏金,更不用说选择“正确”的答案了,所以我最终只能根据最多投票数来做出决定。看起来两种解决方案都可以很好地解决问题,而不使用无基础合并的唯一原因是因为微软认为它不合适...其背后的原因似乎未知。 - Daniel
5个回答

15
我会给你提供一个选项,可能对你有用,也可能没用。如果这可以让你感到安慰,我已经思考了一段时间,并没有找到完全令人满意的解决方案。这是一个非常好的问题,我很想看看其他人如何解决这个问题。
我知道在所有可能的情况下都从源代码构建是一个好主意,但我不喜欢在团队项目之间进行分支。如果你有一些共同的代码,并且需要在2或3个其他团队项目之间进行分支,则分支是可管理的,但如果你有20或30(甚至100)个团队项目,则管理合并变得困难。如果在使用的团队项目中工作的开发人员没有在“主”中具有相同的权限,例如无法查看历史记录等,则可能会出现其他问题。当然,如果你有需要在不同项目集之间的团队项目之间共享的代码,则无论如何都不能进行分支。
因此,考虑到这一点,我建议您将共同的代码视为第三方库,并使用二进制引用。一旦你进入这种思维方式,就会有很多选项可供选择。(这里有一些选项,但可能还有更多)
  1. 您可以让通用代码的构建将二进制文件复制到一个放置位置,并在其中放置一个合并模块以进行打包(如果使用MSI)。然后,您创建一个二进制引用到该放置位置,并获取任何用于打包的东西来导入合并模块。在此方案中,您需要确保放置位置是稳定的(最好对大多数开发人员只读以防止篡改)
  2. 与选项1类似,但使用像NuGet这样的工具来管理您的引用,这将自动化引用新版本的二进制文件的过程。
  3. 您可以将二进制文件检入到您的分支中的$/Product1/branch/lib/common文件夹中,并使用相对路径引用它们。

正如我所说的,我非常想听听其他SO用户如何使用TFS解决共享代码问题的方法。

编辑:经过8年的思考,Nuget包是未来的方向。我已经保留了其余的答案,因为它仍然得到了观看和赞同。将依赖项构建到软件包中并将其存储在二进制存储库(nuget / Nexus / Artifactory / Azure Artifacts等)中几乎是解决此问题的标准方式。


这绝对是一种可能性。然而,主要的缺点在于Product1和Product2不能再维护它们自己的Core版本。任何Core的构建都必须与引用它的每个项目兼容。我们只有3-4个团队项目,所以这可能是可管理的,尽管这些团队项目有12-16个解决方案项目,可能需要引用Core。您对使用文件引用与无基础合并有何看法?再次感谢。 - Daniel
我想我原则上反对无根据的合并,微软也不建议这样做,我认为他们知道自己在做什么 :-) 我过去曾经使用过它们,但只是作为最后的手段。我知道微软已经在TFS 2010 sp1中改进了它们。我唯一不明白的是,为什么从“核心”分支出来时,无根据的合并可以工作,而分支却不能?当你进行无根据的合并时,它会设置合并关系,即随后的合并不再是无根据的,因此最终结果将是相同的。 - James Reed
非常感谢你的反馈,詹姆斯。这些信息一定会对决定选择哪条路线有所帮助。 - Daniel
2
在我的团队中,我们将常用功能打包成NuGet包。我们发现这种方法非常有效。将自己的公共库视为第三方依赖项可以迫使你编写更多可重用的代码 ;) - niaher
使用 NuGet 来管理公共代码对我们来说也非常有效。 - Kamyar

6

TFS 2010分支再探:

我想提供一种信心模式来解决这个问题,那就是使用TFS 2010的无基础合并功能。我强烈推荐阅读Wrox图书《Professional Team Foundation Server 2010》。

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

自从今年4月份首次解决这个问题以来,我们一直在使用它们,并且还没有遇到过无基础合并会出现问题的情况。我想发布一张图片,详细说明我们的分支设置,这是由该书和ALM Ranger团队推荐的。

enter image description here


2
为了实现你想要的,你需要首先将根目录下的所有分支转换为文件夹,然后才能将根目录本身转换为文件夹。
我们曾陷入在不同分支下合并的困境中,然后我们采用了无基础的合并。花了一些时间来弄清楚它的工作原理,但最终我们成功地在分支之间进行了合并,然后建立关系。
tf merge /baseless "D:\TFS2010\Root\ServicePack" "D:\TFS2010\Root\MainLine" /recursive

一旦您完成了无基础合并,您需要签入所有文件。但是您会发现分支之间的关系并没有建立。

为此,请单击“ServicePack分支”(根据我的示例),然后从文件菜单中单击源代码控制 ->分支和合并 ->重新父母移动。在那里,您将有重置父级的选项。完成后,今后每当您想要跨这些分支合并时,您将能够像普通合并一样跨分支进行合并。 enter image description here


你能否评论一下可能出现的任何可预见的障碍吗?为什么微软宣传使用无基础合并作为最后的手段或“你不应该需要这个”功能。 - Daniel
无基础合并是我认为的好功能。这是我们针对基本原则使用的功能之一。它是一种独特的命令,允许我们在关系不存在的分支之间进行合并。 我大约6个月前为我的公司使用了无基础合并,到目前为止我们还没有遇到任何问题。这是一个福音,即使不存在任何关系,我们也可以在分支之间创建关系。 我建议您继续使用无基础合并。 - Sunil Agarwal
感谢您的意见,Sunil。我和项目经理很可能会测试无基础功能并做出决定。 - Daniel

1

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

  1. 创建父分支

    $/Core/Main

  2. 创建子分支

    $/Product1
    -> /Main
    -> /Main/Core
    -> /Main/...

  3. 删除子文件夹

    $/Product1/Main/Core

  4. 使用相同名称创建文件夹

    $/Product1/Main/Core

  5. 将 Product1 文件夹转换为分支

    $/Product1/Main

现在,您可以将更改从 $/Core/Main 合并到 $/Product1/Main/Core ,反之亦然。
对于 Core 分支,可视化功能可能不起作用,但我想这没关系 ;)


好的,你可以将分支转换回文件夹而不是删除文件夹(http://msdn.microsoft.com/en-us/library/ms181425.aspx),但是这个选项对我来说并没有出现。 - stbear
我知道这已经有些过时了,但你需要在源代码控制资源管理器中选择分支,然后单击“文件”(主菜单)->“源代码控制”->“分支和合并”->“转换为文件夹”。此选项在上下文菜单中不可用。 - Brent Newbury

0
如果您想分享通用代码,可以尝试以下解决方案:

转到文件->源控制->从源控制添加项目...

这将弹出一个对话框,允许您从源控制中的其他位置添加项目。
一旦您开始共享此类项目,就值得在源控制结构中变得更加健壮。
我注意到的一件事是,如果您对通用代码进行更改,则不会自动检出。因此,它有点类似于引用项目的差异,但它也适用于TFS。
原始答案

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接