【问题标题】:TFS2010 - Track MergesTFS2010 - 轨道合并
【发布时间】:2015-03-27 16:31:35
【问题描述】:

给定一个变更集 c 并鉴于 c 包含合并操作,我想获取所有已合并并导致 c 的变更集的列表.

例如:

  • 变更集 1 包含对某些文件的一些编辑。
  • 变更集 2 包含对其他一些文件的一些编辑。
  • 变更集 3 是变更集 1+2 与父分支的合并。

现在我想通过询问变更集 3 获得变更集 1+2,其中包含的变更集合并。

我想使用 TFS API 执行此操作。我遇到了 versionControlServer.TrackMerges 方法,但是我不明白该方法期望的 ItemIdentifiers 应该是什么。不幸的是,我找不到如何使用此方法的示例。我也不确定这是否真的是正确的。

【问题讨论】:

    标签: tfs-sdk


    【解决方案1】:

    好的,我花了很长时间,但我想我找到了如何做到这一点。这是将找到所有“父”变更集的代码:

    /// <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;
    }
    

    编辑:

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

    【讨论】:

      【解决方案2】:

      我认为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)
      

      【讨论】:

      • 以上链接已失效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多