草庐IT

c# - TFS2010 : Retrieve all changesets associated with a branch (full recursion)

coder 2024-05-19 原文

这是关于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/

    有关c# - TFS2010 : Retrieve all changesets associated with a branch (full recursion)的更多相关文章

    1. c# - 如何在 ruby​​ 中调用 C# dll? - 2

      如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

    2. C# 到 Ruby sha1 base64 编码 - 2

      我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

    3. 基于C#实现简易绘图工具【100010177】 - 2

      C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

    4. ruby-on-rails - 我现在(2010 年 1 月)应该使用哪个版本的 Ruby? - 2

      我有1.8.6附带的VanillaMacOSXLeopard。我是RoR的新手,所以会学习网上的教程。在使用更高版本的Ruby时,我是否可能会发现遵循它们的问题?我目前正在查看提到1.8.6和1.8.7的这个-http://www.railstutorial.org/book 最佳答案 RoR教程对两者都适用,但如果您正在学习Ruby,则应该学习1.9。Rails3将不支持1.8.6,所以我会选择1.8.7或1.9。我还推荐使用RVM在Ruby版本之间切换。 关于ruby-on-rail

    5. c# - C# 中的 Flatten Ruby 方法 - 2

      我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume

    6. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

      我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

    7. c# - Ruby 等效于 C# Linq 聚合方法 - 2

      什么是Linq聚合方法的ruby​​等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj

    8. c# - 先学什么? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭8年前。Improvethisquestion几年前我去学校学习编程,毕业后我找到了一份系统管理方面的工作,这就是我职业生涯的方向。我想重新开始某种开发,并且一直在“玩”C#和ASP.NET,但我已经听到很多关于其他"new"语言的讨论(新的意思是它们是新的)我)喜欢Ruby和F#。我想我想知道我是否在浪费时间学习主要的MS语言,而不是成为一名通才。很长一段时间没有离开开发社区(如果我曾经离开过的话)让我在潮流中挣扎,我不想落在时代的

    9. c# - 在 C# 中重现 Ruby OpenSSL private_encrypt 输出 - 2

      我有一个简单的Ruby脚本,我用它在某些HTTPheader上执行private_encrypt以签署要发送到ruby​​RESTAPI的Web请求,该API会根据Base64编码字符串测试Base64编码字符串生成而不是解码Base64和解密数据然后测试原始字符串。我使用的脚本是require"openssl"require"base64"path_to_cert=ARGV[0].dupplain_text=Base64.decode64(ARGV[1].dup)private_key=OpenSSL::PKey::RSA.new(File.read(path_to_cert))pu

    10. C# 的 LINQ 用于在 ruby​​ 中等效的集合操作 - 2

      我是ruby​​开发的新手,我目前正在使用rails2.3.11在ruby​​1.8.7中开发一个项目,我想知道这种语言是否有与C#的linq等效的集合操作,例如where子句。谢谢。 最佳答案 Ruby中Linq的where等价于find_all检查documentationfortheEnumerableModule用于其他功能。 关于C#的LINQ用于在ruby​​中等效的集合操作,我们在StackOverflow上找到一个类似的问题: https://

    随机推荐