【问题标题】:Find the tfs path of merged branch找到合并分支的tfs路径
【发布时间】:2013-05-23 06:46:07
【问题描述】:

使用 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 中的合并变更集...

【问题讨论】:

    标签: api tfs merge branch tfs-sdk


    【解决方案1】:

    不幸的是,没有 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 递归文件路径的目录,直到找到匹配项。

    【讨论】:

    • 这个解决方案是我的后备解决方案,但它不喜欢我有两个原因:1.如果您的父分支不是分支但仍然是 tfs 中的文件夹,您可以使用 QueryRootBranchObjects()并且找不到它 2. 如果您有多个分支名称 dev、dev/test、dev/test2、dev/test3 并且在您的源代码中您有一个文件夹“test”它可以发现好的父分支是“开发”,实际上是“开发/测试”。你不能 100% 确定 :( 即使是极少数情况......
    • 我进行了编辑。 2. 很容易解决,而且不可能有一个分支$/dev,然后在它下面有另一个分支$/dev/test。 TFS 在分支步骤中不允许这样做。
    猜你喜欢
    • 2012-09-24
    • 2017-05-03
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    相关资源
    最近更新 更多