这是关于TFS 2010的my previous question和创建变更日志的可能性之后的。

我以前使用标签来标识程序的版本,但是由于标签不是固定的时间点,因此现在使用分支。

分支层次结构如下所示:

如您所见,主干有两个不同的应用程序:APP_A(应用程序A)和APP_B(应用程序B)。两者几乎相同,但功能上有所不同。

这是创建应用程序新版本(例如1.3版)的过程:

  • 修改了Main trunk(添加了新功能,修复了错误……)
  • 从修改后的Main trunk中,创建一个新分支:Main trunk 1.3
  • APP_A分支可能会被修改,因此APP_A的独特功能将与v1.3
  • 的修改一起使用
  • APP_B分支可能会被修改,因此APP_B的独特功能将与v1.3
  • 的修改一起使用
  • Main trunk 1.3合并到APP_AAPP_B,因此APP_AAPP_B应用程序都收到Main trunk的修改
  • 从修改后的APP_A分支中创建一个新分支:APP_A_1.3
  • 从修改后的APP_B分支中创建一个新分支:APP_B_1.3

  • 我的目标是能够在APP_A_1.3APP_A_1.2之间生成更改日志。

    通过changelog表示工作项列表。 每个 checkin 的变更集都与一个或多个WorkItem(例如Bug项)相关联。 我希望能够获得与影响APP_A_1.3的变更集链接的所有工作项的列表:这些变更集可能来自Main trunk(上面的步骤1),APP_A branch(上面的步骤3),甚至是APP_A_1.3分支本身(如果在创建分支后 checkin 了修补程序)。

    为了获得此工作项列表,我尝试获取“链接”到APP_A_1.2的所有变更集的列表(“linked” =变更集中 checkin 的代码现在位于分支APP_A_1.2 上), “链接”到APP_A_1.3的所有变更集的列表。

    然后,我将能够知道哪些变更集“链接”到APP_A_1.3而不是“链接”到APP_A_1.2。从变更集的这个子集中,我将获得所有关联的WorkItem,从而获得我的变更日志。

    这是我的问题:如何获得与指定分支“链接”的所有变更集的列表?我正在将TFS 2010 API用于C#代码。

    我程序的输入(它将检索指定分支的所有变更集)将是该分支的名称(例如APP_A_1.2),输出将是以下变更集的列表:

    应用于APP_A_1.2分支本身的
  • 变更集
  • 在创建APP_A之前,在APP_A_1.2分支上应用的
  • 变更集
  • 在已合并到Main trunk 1.2上的APP_A分支上应用的
  • 变更集
  • 在创建Main trunk之前,对Main trunk 1.2分支应用了
  • 变更集

  • 我编写了以下代码来获取所有这些变更集:
    // Gets the list of all changesets ID from APP_A_1.2 branch
    var branch1ChangeSets = myVersionControlServer.QueryHistory(
        "$/PATH/APP_A_1.2/",
        VersionSpec.Latest,
        0,
        RecursionType.Full,
        null,
        null,
        null,
        int.MaxValue,
        false,
        false).OfType<Changeset>().Select(z => z.ChangesetId).ToList();
    

    即使指定了RecursionType.Full,上述代码也只有返回APP_A_1.2分支本身已 checkin 的变更集。这与Visual Studio中“源代码资源管理器” View 上的“历史记录”命令相同。

    然后,我尝试了以下代码:
    // Gets the list of all changesets ID from APP_A_1.2 branch
    var branch1MergedChangeSets = myVersionControlServer.QueryMerges(
        null,
        null,
        "$/PATH/APP_A_1.2/",
        VersionSpec.Latest,
        null,
        null,
        RecursionType.Full).Select(z => z.SourceVersion).ToList();
    

    这将返回在APP_A_1.2分支上 checkin 的变更集+在创建APP_A之前在APP_A_1.2分支上 checkin 的变更集。好多了,但还不够。我找不到一种方法来使递归工作在APP_A上方(在我的情况下为Main trunk)的分支中……

    有人有主意吗?

    另外,欢迎任何更好的想法来获取两个分支之间的变更日志。
    谢谢。

    最佳答案

    首先让我先问一个问题。在帖子的顶部,您写道:
    “我的目​​标是能够在APP_A_1.3和APP_A_1.2之间生成更改日志。”

    但是,当您撰写具体更改时,您正在寻找的列表:
    应用于APP_A_1.2分支本身的变更集
    创建APP_A_1.2之前在APP_A分支上应用的变更集
    在已合并到APP_A之前在主干1.2分支上应用的变更集
    创建主干1.2之前在主干分支上应用的变更集

    这不是有效的列表,因为它将为您提供所有对APP_A_1.3,APP_A_1.2、1.1等做出的更改,直到存储库的开始。

    我现在无法测试我的方法,但这是我会做的:
    -QueryHistory直接将所有更改 checkin 分支1.3
    -使用QueryMergesExtended跟随合并到此分支中。 QueryMergesExtended(http://msdn.microsoft.com/zh-cn/library/ff736485.aspx)是在TFS 2010中添加的,目的是要比QueryMerges和QueryMergesWithDetails更加高效和健壮,以支持分支可视化工具
    -afaik,您不需要在QueryMergesExtended中指定选项FollowRenames,因为您在分支的根上查询合并
    -从APP_A获取源更改列表时,您需要检查每个更改集以查看其中是否包含合并更改。如果是这样,则需要在app_a上查询这些变更集的合并。递归执行此操作,直到遍历整个分支层次结构。

    在旁边的主题上,您可以稍后查看QueryMergeRelationships(http://msdn.microsoft.com/en-us/library/microsoft.teamfoundation.versioncontrol.client.versioncontrolserver.querymergerelationships.aspx),它为您提供了tfs 2010中引入的分支对象列表(这是在Source Control Explorer中选择文件夹并单击Convert to branch时发生的情况)。但是,如果您可以用不需要的方式(对它们进行硬编码)发现分支,则不需要使用它。

    希望这可以帮助!

    关于c# - TFS2010 : Retrieve all changesets associated with a branch (full recursion),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9275760/

    10-10 09:00