2012-03-01 36 views
5

给定一个变更ç并考虑到Ç包含合并操作,我想获得已合并,并导致Ç所有变更集的列表。TFS2010 - 轨道梅杰斯

例如:

  • 变更集1包含了一些文件进行一些编辑。
  • 变更集2包含一些其他文件的编辑。
  • 变更集3是将变更集1 + 2合并到父分支。

现在我想要获取变更集1和变更集3所包含的变更集3。

我想使用TFS API来做到这一点。我遇到了versionControlServer.TrackMerges方法,但是我不明白该方法期望的ItemIdentifiers是什么。不幸的是,我找不到如何使用这种方法的例子。另外我不确定这是否真的是正确的。

回答

9

好吧,我花了很长时间,但我想我已经找到了如何做到这一点。这是会发现所有的“父母”的变更代码:

/// <summary> 
/// Gets the changesets which have resulted in the given changeset due 
/// to a merge operation. 
/// </summary> 
/// <param name="changeset">The changeset.</param> 
/// <param name="versionControlServer">The version control server.</param> 
/// <returns> 
/// A list of all changesets that have resulted into the given changeset. 
/// </returns> 
public static List<Changeset> GetMergedChangesets(Changeset changeset, VersionControlServer versionControlServer) 
{ 
    // remember the already covered changeset id's 
    Dictionary<int, bool> alreadyCoveredChangesets = new Dictionary<int, bool>(); 

    // initialize list of parent changesets 
    List<Changeset> parentChangesets = new List<Changeset>(); 

    // go through each change inside the changeset 
    foreach(Change change in changeset.Changes) 
    { 
     // query for the items' history 
     var queryResults = versionControlServer.QueryMergesExtended(
           new ItemSpec(change.Item.ServerItem, RecursionType.Full), 
           new ChangesetVersionSpec(changeset.ChangesetId), 
           null, 
           null); 

     // go through each changeset in the history 
     foreach (var result in queryResults) 
     { 
      // only if the target-change is the given changeset, we have a hit 
      if (result.TargetChangeset.ChangesetId == changeset.ChangesetId) 
      { 
       // if that hit has already been processed elsewhere, then just skip it 
       if (!alreadyCoveredChangesets.ContainsKey(result.SourceChangeset.ChangesetId)) 
       { 
        // otherwise add it 
        alreadyCoveredChangesets.Add(result.SourceChangeset.ChangesetId, true); 
        parentChangesets.Add(versionControlServer.GetChangeset(result.SourceChangeset.ChangesetId)); 
       } 
      } 
     } 
    } 

    return parentChangesets; 
} 

编辑:

我才意识到,有在上面的代码中的小“错误”,我以前写“ VersionSpec.Latest“,但是:”新的ChangesetVersionSpec(changeset.ChangesetId)“会更好,因为一旦源分支已被删除,变更集也将被跟踪。

0

我觉得这页由Ben Clark-Robinson回答了原来的问题如何使用TrackMerges()API:

这里有一个验证的例子:

using tfvcc = Microsoft.TeamFoundation.VersionControl.Client; 

var sourcePath = "$/projectName/branchObjectName1"; 
var targetPath = "$/projectName/branchObjectName2"; 

versionCtl.TrackMerges(
    sourceChangesetIds: new[] { 1000 }, 
    sourceItem: new tfvcc.ItemIdentifier(sourcePath), 
    targetItems: new[] { new tfvcc.ItemIdentifier(targetPath) }, 
    pathFilter: null) 
+0

上面的链接已经死了。 – 2016-08-22 18:25:43