这是关于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_A
和APP_B
,因此APP_A
和APP_B
应用程序都收到Main trunk
的修改APP_A
分支中创建一个新分支:APP_A_1.3
APP_B
分支中创建一个新分支:APP_B_1.3
我的目标是能够在
APP_A_1.3
和APP_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/