5

使用 TFS,我有 trunk$/project/trunk和一个 branch $/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 中的合并变更集......

4

1 回答 1

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 中使用时,我被这个Connect 问题QueryRootBranchObjects所困扰。原因是一些虚假的分支,分支名称中有撇号。

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

于 2013-06-05T05:07:48.853 回答