2012-03-01 54 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