1

编辑:我的问题措辞不佳。我想要实现的是“丢弃”变更集的合并历史

编辑 2 我想出了如何从合并候选队列中删除变更集。我并不特别认为这是一个好主意,但我只是为了“完整性”而包含代码。

场景:开发人员修复分支上的错误并签入。开发人员然后修复主干上的错误而不是合并(主干发生了巨大变化,因此没有合并)。但是,从分支合并到主干时,变更集会出现在列表中。我正在尝试标记此变更集以将其从此列表中删除。这可以通过传递“丢弃”开关使用命令行实用程序来完成......我正在尝试使用 TFS API 来实现相同的目标......

我认为我非常接近使用 Merge 方法,但不确定要传入的选项。我不想执行合并只想将变更集标记为已合并而不合并

已经使用 Winforms 应用程序从 TFS 获得了变更集列表,并且希望能够通过使用 C# 调用 discard 来合并变更集

合并命令在这里

这可以使用 TFS .NET 库来完成,还是我必须从 winforms 应用程序调用命令行编辑器?

//get the merge candidates
IEnumerable<MergeCandidate> mergeCandidates =
                _vcs.GetMergeCandidates(cboSource.Text, cboTarget.Text, RecursionType.Full)
                    .OrderByDescending(x => x.Changeset.ChangesetId)
                    .AsEnumerable();


//user select a changeset from a grid and then I want to discard this changeset from the //'merge list'

 string _changeset = grdChangeSets.CurrentRow.Cells[0].Value.ToString();
            VersionSpec vfrom = VersionSpec.ParseSingleSpec(_changeset, null);
            VersionSpec vto = VersionSpec.ParseSingleSpec(_changeset,null);
            _workspaces[0].Merge(cboSource.Text, cboTarget.Text, vfrom, vto, LockLevel.None, RecursionType.Full,
                                 MergeOptions.AlwaysAcceptMine);

编辑 2 代码

string _changeSetId = grdChangeSets.CurrentRow.Cells[0].Value.ToString();


            VersionSpec vfrom = VersionSpec.ParseSingleSpec(_changeSetId, null);
            VersionSpec vto = VersionSpec.ParseSingleSpec(_changeSetId, null);


            UsiWorkspace wksp = new UsiWorkspace();
            wksp.ResolveConflicts(_workspaces[0]);

            GetStatus getStatus = _workspaces[0].Merge(cboSource.Text,
                cboTarget.Text, 
                vfrom, 
                vto, 
                LockLevel.None, 
                RecursionType.Full, 
                MergeOptions.AlwaysAcceptMine);


var _conflicts = workspaces[0].QueryConflicts(null, true);
            foreach (Conflict conflict in _conflicts)
            {
                conflict.Resolution = Resolution.DeleteConflict;
                workspace.ResolveConflict(conflict);
            }



            var wip = new WorkspaceCheckInParameters(_workspaces[0].GetPendingChanges(),string.Format("CHECKED IN FROM TFS TOOL - {0} {1}", DateTimeOffset.Now.ToString(), Environment.UserName))
                {

                    OverrideGatedCheckIn = ((CheckInOptions2) _vcs.SupportedFeatures & CheckInOptions2.OverrideGatedCheckIn) ==
                        CheckInOptions2.OverrideGatedCheckIn,
                    PolicyOverride = new PolicyOverrideInfo("CHECKED IN FROM TFS TOOL - POLICY", null)
                };

            _workspaces[0].CheckIn(wip);
4

1 回答 1

3

TFS api中有一个合并方法:http: //msdn.microsoft.com/en-us/library/ff731634.aspx

也许是这样的:

var status = _workspace.Merge(sourceTfsPath, targetTfsPath, null, null, LockLevel.None, RecursionType.Full,
    MergeOptions.AlwaysAcceptMine);
Trace.WriteLine(status.NumOperations);
var conflicts = _workspace.QueryConflicts(null, true);
foreach (var conflict in conflicts)
{
    conflict.Resolution = Resolution.AcceptYours;
    _workspace.ResolveConflict(conflict);
}
于 2013-05-28T12:12:18.020 回答