我正在寻找一种在我的应用程序的两个版本之间自动生成变更日志(实际上是工作项列表)的方法。我有两个版本的应用程序,v1 和 v2,每个版本都由 TFS 2010 中的标签(LABEL1 和 LABEL2)标识,这是我在构建应用程序设置之前手动创建的。我有一个分支系统,这意味着我有一个主干,大部分错误都已修复,还有一个分支主要使用主干合并应用补丁(但也有一些仅在分支上与主干无关的修复) . 我的应用程序的两个版本(v1 和 v2)是来自分支的版本。
我希望 TFS 2010 能够返回这两个标签之间已修复的错误列表(即类型 = 已关闭和验证的错误的工作项列表)。
我尝试使用 TFS 2010 的 Web UI 或使用 Visual Studio 来实现这一点,但我没有找到任何方法。
然后我尝试使用以下命令行向 tf.exe 询问历史记录:
tf history /server:http://server_url/collection_name "$/project_path" /version:LLABEL1~LLABEL2 /recursive /noprompt /format:brief
其中 LABEL1 是与应用程序 v1 的源代码相关联的标签,而 LABEL2 是与应用程序 v2 的源代码相关联的标签。它实际上以两种方式失败:-命令行仅返回变更集列表,而不是关联的已关闭工作项的列表-变更集列表仅包含我在分支本身上应用的变更集,而不是我也应用的变更集和主干,然后合并到分支。设置与否“/slotmode”参数不会改变任何东西。
在那里,我尝试编写一段 C# 代码来检索工作项列表(而不是变更集列表):
var tfs = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("http://server_url/collection_name"));
VersionControlServer controlServer = tfs.GetService<VersionControlServer>();
VersionControlServer vcs = tfs.GetService<VersionControlServer>();
VersionSpec sFrom = VersionSpec.ParseSingleSpec("LLABEL1", null);
VersionSpec sTo = VersionSpec.ParseSingleSpec("LLABEL2", null);
var changesets = vcs.QueryHistory(
"$/project_path",
sTo,
0,
RecursionType.Full,
null,
sFrom,
sTo,
int.MaxValue,
true,
false); // Slotmode to false
Dictionary<int, WorkItem> dico = new Dictionary<int, WorkItem>();
foreach (Changeset set in changesets)
{
foreach (WorkItem zz in set.WorkItems)
{
if (!dico.ContainsKey(zz.Id))
{
dico.Add(zz.Id, zz);
}
}
}
foreach (KeyValuePair<int, WorkItem> pair in dico.OrderBy(z => z.Key))
{
Console.WriteLine(string.Format("ID: {0}, Title: {1}", pair.Key, pair.Value.Title));
}
这实际上有效,我得到了两个标签之间的工作项列表,这实际上是我想要的。但只考虑与在分支本身上提交的变更集相关的工作项:在主干上解决然后合并到分支的“Bug”类型的工作项不会出现。Slotmode 不会改变任何东西。
然后我终于尝试用由变更集定义的 VersionSpecs 替换由标签定义的 VersionSpecs:
VersionSpec sFrom = VersionSpec.ParseSingleSpec("C5083", null);
VersionSpec sTo = VersionSpec.ParseSingleSpec("C5276", null);
我的代码终于可以工作了。
所以我的问题是:如何使用标签获得相同的结果,标签是我用来识别版本的 TFS 对象?如果不可能,我应该如何识别 TFS 2010 中的版本?谢谢。
顺便说一句,我在 stackoverflow 上发现了一些问题,但没有一个给我带标签的答案。例如: 问题示例