2012-03-01 21 views
5

はチェンジCを考えるとCはマージ操作を含んでいることを考えると、私は合併し、Cが生じてきたすべてのチェンジセットのリストを取得したいと思います。例えばTFS2010 - トラックの併合

  • チェンジ1には、いくつかのファイルのためのいくつかの編集が含まれています。
  • 変更セット2には、他のいくつかのファイルの編集内容が含まれています。
  • チェンジセット3は、チェンジセット1 + 2を親ブランチにマージしたものです。

変更セット3に変更セット3を問い合わせて、変更セット1 + 2を取得したいと思います。

私はこれをTFS APIを使用して行いたいと思います。私はversionControlServer.TrackMergesメソッドを見つけましたが、メソッドが期待するItemIdentifierは何か分かりません。残念ながら、私はこのメソッドを使用する方法の例を見つけることができません。また、それが本当に正しいのかどうかはわかりません。

答えて

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)を使用すると、ソースブランチが削除されるとチェンジセットも追跡されるため、より効果的です。私はBen Clark-Robinsonことで、このページはTrackMerges()APIを使用するには、どのように元の質問に答えると思います

0

:上記のリンクが死んでいる

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

はここで検証例です。 –