TFS2010 - 跟踪合并

Chr*_*ian 5 tfs-sdk tfs2010

给定一个变更集c并且假设c包含合并操作,我想获得已合并并导致c的所有变更集的列表.

例如:

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

现在我想从变更集3中获取变更集1 + 2,变更集合并包含它.

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

Chr*_*ian 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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我刚刚意识到上面的代码中有一个小"bug",我曾经在查询中写过"VersionSpec.Latest",但是:"new ChangesetVersionSpec(changeset.ChangesetId)"会更好,因为那时更改集也会删除源分支后进行跟踪.