在 C'# 中以编程方式获取所有 TFS 分支
Get all TFS Branches programmatically in C'#
我正在尝试以编程方式获取 Visual Studio 2013 年 TFS 中所有分支的列表。经过一些研究后,我发现这个博客详细介绍了如何获取分支:
Displaying all branch hierarchies in TFS 2010
我修改了代码,改为将所有内容都存储在列表中。
private void Setup()
{
string serverName = "serverName"; //in the code this is set to the actual server name
TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri(serverName));
VersionControlServer vcs = tfs.GetService<VersionControlServer>();
var bos = vcs.QueryRootBranchObjects(RecursionType.OneLevel);
Array.ForEach(bos, (bo) => DisplayAllBranches(bo, vcs));
}
private void DisplayAllBranches(BranchObject bo, VersionControlServer vcs)
{
_listOfBranches.Add(bo.Properties.RootItem.Item);
var childBos = vcs.QueryBranchObjects(bo.Properties.RootItem, RecursionType.OneLevel);
foreach (var child in childBos)
{
if (child.Properties.RootItem.Item == bo.Properties.RootItem.Item)
continue;
DisplayAllBranches(child, vcs);
}
}
我遇到的问题是 BranchObjects[] bos 总是空的。有没有我遗漏的东西,或者有更好的方法来获取所有分支的列表?
该代码应该可以正常工作(对我有效)。我怀疑您的服务器名称变量中缺少您的集合名称?
如果您有合理的标准设置,您的服务器名称变量格式应为:http://ServerName:Port/tfs/CollectionName
例如:http://tfsServer01:8080/tfs/MyCollection
你能验证 vcs 对象是否有效吗?你能执行一些其他操作吗?获取项目?
您确定您的存储库中有分支吗?请注意,"branch ocjects" 是在 tfs 2010 中添加的,它们不等于只是分支操作。在源代码管理资源管理器中,它们有灰色图标,可以使用上下文菜单创建它们
在做了更多研究后,我发现了问题所在。我们的 TFS 结构类似于以下内容:
$/Root
$/Root/Folder
$/Root/Folder/Branch
第一层不会 return 任何分支,因为没有任何分支。因此,我使用了一种更简单的方法来获取所有分支。
var branchObjects = vcs.QueryRootBranchObjects(RecursionType.Full);
foreach (var branch in branchObjects)
{
var branchName = branch.Properties.RootItem.Item;
var parentFolder = branchName.Substring(0, branchName.LastIndexOf('/'));
if (!_listOfBranches.Contains(parentFolder))
{
_listOfBranches.Add(parentFolder);
}
_listOfBranches.Add(branchName);
}
_listOfBranches.Sort();
目前这不是最干净的方法。但它能够检索指定项目的所有分支,以及父文件夹(目前不包括根文件夹)。
我正在尝试以编程方式获取 Visual Studio 2013 年 TFS 中所有分支的列表。经过一些研究后,我发现这个博客详细介绍了如何获取分支:
Displaying all branch hierarchies in TFS 2010
我修改了代码,改为将所有内容都存储在列表中。
private void Setup()
{
string serverName = "serverName"; //in the code this is set to the actual server name
TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri(serverName));
VersionControlServer vcs = tfs.GetService<VersionControlServer>();
var bos = vcs.QueryRootBranchObjects(RecursionType.OneLevel);
Array.ForEach(bos, (bo) => DisplayAllBranches(bo, vcs));
}
private void DisplayAllBranches(BranchObject bo, VersionControlServer vcs)
{
_listOfBranches.Add(bo.Properties.RootItem.Item);
var childBos = vcs.QueryBranchObjects(bo.Properties.RootItem, RecursionType.OneLevel);
foreach (var child in childBos)
{
if (child.Properties.RootItem.Item == bo.Properties.RootItem.Item)
continue;
DisplayAllBranches(child, vcs);
}
}
我遇到的问题是 BranchObjects[] bos 总是空的。有没有我遗漏的东西,或者有更好的方法来获取所有分支的列表?
该代码应该可以正常工作(对我有效)。我怀疑您的服务器名称变量中缺少您的集合名称?
如果您有合理的标准设置,您的服务器名称变量格式应为:http://ServerName:Port/tfs/CollectionName
例如:http://tfsServer01:8080/tfs/MyCollection
你能验证 vcs 对象是否有效吗?你能执行一些其他操作吗?获取项目? 您确定您的存储库中有分支吗?请注意,"branch ocjects" 是在 tfs 2010 中添加的,它们不等于只是分支操作。在源代码管理资源管理器中,它们有灰色图标,可以使用上下文菜单创建它们
在做了更多研究后,我发现了问题所在。我们的 TFS 结构类似于以下内容:
$/Root
$/Root/Folder
$/Root/Folder/Branch
第一层不会 return 任何分支,因为没有任何分支。因此,我使用了一种更简单的方法来获取所有分支。
var branchObjects = vcs.QueryRootBranchObjects(RecursionType.Full);
foreach (var branch in branchObjects)
{
var branchName = branch.Properties.RootItem.Item;
var parentFolder = branchName.Substring(0, branchName.LastIndexOf('/'));
if (!_listOfBranches.Contains(parentFolder))
{
_listOfBranches.Add(parentFolder);
}
_listOfBranches.Add(branchName);
}
_listOfBranches.Sort();
目前这不是最干净的方法。但它能够检索指定项目的所有分支,以及父文件夹(目前不包括根文件夹)。