Phi*_*ppe 5 api merge tfs branch tfs-sdk
使用TFS,我有trunk $/project/trunk和分支$/project/dev/feature/new_one.
我已将我的分支合并回主干,如下所示:
C33($/project/trunk)
| \
| \
| C32($/project/dev/feature/new_one)
| |
| |
| |
...
Run Code Online (Sandbox Code Playgroud)
我使用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中的合并变更集...
遗憾的是,没有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);
Run Code Online (Sandbox Code Playgroud)
如图所示,分支的路径为BranchObject.Properties.RootItem.Item.我相信BranchObject通过检查合并文件的路径中包含哪个分支的路径来确定数组中的相关是安全的(因为它最多只能匹配一个分支,因为TFS强制在给定的文件夹层次结构中只能存在一个分支).
需要注意的是,在TFS 2012中使用时,我遇到了这个 Connect问题QueryRootBranchObjects.原因是一些假分支在分支名称中有撇号.
解决方法是使用VersionControlServer.QueryBranchObjects,但这需要一个项目标识符,它是分支的确切路径.显然,此时您不知道分支路径,因为您拥有的只是一个文件路径,因此您必须QueryBranchObjects逐个递归调用文件路径的目录,直到您获得匹配为止.