在 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();

目前这不是最干净的方法。但它能够检索指定项目的所有分支,以及父文件夹(目前不包括根文件夹)。