找到合并分支的tfs路径

时间:2013-05-28 10:23:42

标签: api tfs merge branch tfs-sdk

使用TFS,我有中继$/project/trunk和分支$/project/dev/feature/new_one

我已将我的分支合并回主干,如下所示:

C33($/project/trunk)
|  \
|   \
|    C32($/project/dev/feature/new_one)
|     |
|     |
|     |
...

我使用TFS API并且可以找到合并变更集C33。使用方法QueryMerges(),我能够找到包含文件所有更改的父变更集C32,但不能找到我需要的信息:(

有没有办法使用TFS API查找合并分支$/project/dev/feature/new_one的存储库路径?

使用变更集C32,我只能获取已修改文件的路径,例如$/project/dev/feature/new_one/path/to/file.txt,但我无法从文件的完整路径中提取分支的路径:(

PS:自TFS2008以来的解决方案将是最好的,但如果它自2010年以来一直有效,它应该是好的......

PS2:解决这个问题将有助于管理我开发的git-tfs中的合并变更集......

1 个答案:

答案 0 :(得分:5)

不幸的是,没有API方法来获取给定项目路径的分支,您认为这是一个相当常见的用例。

从TFS 2010开始,您可以使用VersionControlServer.QueryRootBranchObjects查询版本控制中的所有分支。使用RecursionType.Full作为此方法的参数,您将获得所有分支的BranchObject数组,其中没有父所有后代。然后,您可以按如下方式确定给定文件路径的分支:

var collection = new TfsTeamProjectCollection(new Uri("http://tfsuri"));
var versionControl = collection.GetService<VersionControlServer>();

var branchObjects = versionControl.QueryRootBranchObjects(RecursionType.Full);

var mergeFilePath = "$/project/dev/feature/new_one/path/to/file.txt";
var branch = branchObjects.SingleOrDefault(b => {
            var branchPath = b.Properties.RootItem.Item;
            return mergeFilePath.StartsWith(branchPath.EndsWith("/") ? branchPath : branchPath + "/");
        });

Console.WriteLine(branch.Properties.RootItem.Item);

如图所示,分支的路径位于BranchObject.Properties.RootItem.Item。我相信只需通过检查合并文件路径中包含哪个分支的路径就可以安全地找到数组中的相关BranchObject(假设它最多只能匹配一个分支,因为TFS强制只有一个分支可以存在在给定的文件夹层次结构中)。

请注意,在TFS 2012中使用QueryRootBranchObjects时,我遇到了this Connect问题。原因是一些假分支在分支名称中有撇号。

对此的解决方法是使用VersionControlServer.QueryBranchObjects,但这需要一个项目标识符,它是分支的确切路径。显然,此时您不知道分支路径,因为您拥有的只是一个文件路径,因此您每次都必须递归调用QueryBranchObjects的文件路径的目录,直到您获得匹配为止。