TFS-SDK:合并不起作用

时间:2012-02-22 14:30:45

标签: tfs merge tfs2010 tfs-sdk

作为更大实现的一部分,我正在尝试使用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看起来像这样:

enter image description here没有发生任何事情。

如果我尝试在IDE中合并,我会得到几个合并候选人。
如果我这样做,也可以看到相同的合并候选人:

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

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

2 个答案:

答案 0 :(得分:5)

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);

答案 1 :(得分:4)

虽然与Shai Raiten博客的链接证明是有帮助的,但上述答案中没有明确说明改变的原因,也没有在Shai的博客中明确说明(或在Microsoft's documentation就此而言)。这里的关键是fromVersion和toVersion的含义。这个问题的作者似乎犯了同样的错误,误解了这些参数的含义。就我而言,我理解&#34;来自&#34;和&#34;到&#34;分别引用合并的源(起始点)和目标(终点)。虽然我不明白为什么要指定&#34; to&#34;在这种情况下的版本,因为为了实际进行有意义的合并,目标的版本总是必须是提示。因此,将参数描述读作&#34;开始&#34;和&#34;结束&#34;版本没有让我觉得与这种解释不一致。

我最终明白的是,在这种情况下,&#34;来自&#34;和&#34;到&#34;是两个引用合并的,其中&#34;来自&#34;指的是一系列变更集的起始点,&#34;到&#34;指的是一系列变更集的结束点。如果你省略&#34; fromVersion&#34;参数然后你说你想要包括所有变更集一直回到开头(或最后记录的合并),否则你说你只想包括远远超过指定版本的变更集。如果省略&#34; toVersion&#34;那么你说你想要包括所有变更集,直到Tip版本,否则你说你想要只包括指定版本的变更集。

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