【问题标题】:TFS-SDK: Merge doesn't workTFS-SDK:合并不起作用
【发布时间】:2012-03-12 21:29:32
【问题描述】:

作为更大实施的一部分,我正在尝试使用 TFS-SDK 实施我的源代码控制分支/文件夹的合并操作。我正在处理 TFS2010 安装。
我所拥有的是:

using System;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.VersionControl.Common;

namespace MergeBranchesFolders
{
    class Program
    {
        static void Main()
        {
            TfsTeamProjectCollection teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new Uri("http://TFSSERVER/Collection"));
            var versionControl = teamProjectCollection.GetService<VersionControlServer>();

            const string fromPath = "$/TeamProject/SourceDir";
            const string toPath = "$/TeamProject/TargetDir";

            Workspace myWorkspace = versionControl.GetWorkspace("WorkspaceName", "WorkspaceOwner");
            GetStatus getStatus = myWorkspace.Merge(fromPath, toPath, VersionSpec.Latest, VersionSpec.Latest,
                                                    LockLevel.None, RecursionType.Full, MergeOptionsEx.None);
        }
    }
}

我确信我可以正确访问 myWorkspace,但 getStatus 看起来像这样:


这几乎说明什么都没发生。

但是,如果我尝试在 IDE 中合并,我会得到几个合并候选者。
如果我执行以下操作,也会看到相同的合并候选者:

var mergeCandidates = versionControl.GetMergeCandidates(fromPath, toPath,RecursionType.Full).ToList();

fromPath/toPath 作为分支和文件夹我都失败了——即使是单个文件。
我能找到的唯一资源是 this 一个,这没有帮助...

【问题讨论】:

    标签: tfs merge tfs-sdk


    【解决方案1】:

    Shai Raiten 的 blog-post 来救援!

    这失败了:

    GetStatus getStatus = myWorkspace.Merge(fromPath, toPath, VersionSpec.Latest, VersionSpec.Latest,
                                                        LockLevel.None, RecursionType.Full, MergeOptionsEx.None);
    

    这成功了:

    GetStatus getStatus = myWorkspace.Merge(fromPath, toPath, null, null, LockLevel.None, RecursionType.Full, MergeOptionsEx.None);
    

    【讨论】:

      【解决方案2】:

      虽然事实证明指向 Shai Raiten 博客的链接很有帮助,但上述答案中并没有很清楚地说明更改的原因,在 Shai 的博客中也没有说得很清楚(或在 Microsoft's documentation 中)。这里的关键在于fromVersion和toVersion的含义。这个问题的作者似乎犯了同样的错误,误解了这些参数的含义。就我而言,我理解“from”和“to”分别是对合并的源(起点)和目标(终点)的引用。虽然我不明白为什么在这种情况下必须指定“to”版本,因为为了真正进行有意义的合并,目标的版本 always 必须是 Tip。因此,将参数描述解读为“开始”和“结束”版本并没有让我觉得与这种解释不一致。

      我终于明白的是,在这种情况下,“from”和“to”指的是合并的 source,其中“from”指的是一系列变更集的开始点,而“to”指的是一系列变更集的结束点。如果您省略“fromVersion”参数,那么您是说您想要包含所有的变更集,一直回到开头(或最后记录的合并),否则您是说您只想包含回溯到指定的版本。如果您省略了“toVersion”,那么您就是说您想要包含直到 Tip 版本的所有变更集,否则您就是说您想要仅包含直到指定版本的变更集。

      因此,在将 fromVersion 和 toVersion 参数都指定为 VersionSpec.Latest 的原始代码中,您是说要合并最新版本和最新版本之间发生的所有变更集,根据定义,最新版本不包含任何更改。但是,在修改后的代码中,为这两个参数指定了 null,您将包括所有可用的变更集,没有任何约束。

      【讨论】:

        猜你喜欢
        • 2012-10-21
        • 2015-10-25
        • 2017-08-31
        • 2014-11-20
        • 2011-03-13
        • 2017-05-07
        • 2012-04-14
        • 2018-11-18
        相关资源
        最近更新 更多