【问题标题】:TFS 2010 API: Get old name/location of renamed/moved itemTFS 2010 API:获取重命名/移动项目的旧名称/位置
【发布时间】:2014-05-12 11:33:07
【问题描述】:

我正在编写一个应用程序,该应用程序从 TFS 中提取变更集并导出一个 csv 文件,该文件描述了用于将这些更改推送到 ClearCase 的脚本中的最新更改。然而,“最新”并不一定意味着最新。如果一个文件被添加然后编辑,我只需要知道文件被添加,并获取最新版本,以便我的脚本知道如何正确处理它。其中大部分是相当直截了当的。我挂断了已重命名或移动的文件,因为我不想将该项目显示为已删除,并添加了另一个项目。为了维护 ClearCase 的完整性,我需要在 CSV 文件中包含该项目的移动或重命名,以及旧位置和新位置。

因此,我遇到的问题是将重命名(或移动)的文件追溯到以前的名称或位置,以便我可以将其与新的位置/名称相关联。我可以在 API 的哪个位置获取这些信息?

【问题讨论】:

  • 你是如何向服务器查询数据的?您只是查询最新版本的项目吗?你在走历史吗?

标签: tfs tfs-sdk


【解决方案1】:

这是你的答案: http://social.msdn.microsoft.com/Forums/en/tfsgeneral/thread/f9c7e7b4-b05f-4d3e-b8ea-cfbd316ef737 使用 QueryHistory 你可以发现一个项目被重命名了,然后使用它之前的变更集(之前那个说它被重命名的)你可以找到它之前的名字。

【讨论】:

    【解决方案2】:

    您将需要以类似于以下方法的方式使用VersionControlServer.QueryHistory。请特别注意SlotMode,它必须是false,才能进行重命名。

    private static void PrintNames(VersionControlServer vcs, Change change)
    {
        //The key here is to be sure Slot Mode is enabled.
        IEnumerable<Changeset> queryHistory =
            vcs.QueryHistory(
                new QueryHistoryParameters(change.Item.ServerItem, RecursionType.None)
                    {
                        IncludeChanges = true,
                        SlotMode = false,
                        VersionEnd = new ChangesetVersionSpec(change.Item.ChangesetId)
                    });
    
        string name = string.Empty;
    
        var changes = queryHistory.SelectMany(changeset => changeset.Changes);
    
        foreach (var chng in changes)
        {
            if (name != chng.Item.ServerItem)
            {
                name = chng.Item.ServerItem;
                Console.WriteLine(name);
            }
        }
    }
    

    编辑:上移了另一个解决方案。当我针对纯粹的重命名更​​改进行测试时,接下来的内容有效,但当我厌倦了重命名和编辑更改时,它就崩溃了。

    这可能是获取前一个名称的最有效方法。虽然它可以工作(TFS2013 API 针对 TFS2012 安装),但对我来说它看起来像一个错误。

    private static string GetPreviousServerItem(VersionControlServer vcs, Item item)
    {
        Change[] changes = vcs.GetChangesForChangeset(
            item.ChangesetId,
            includeDownloadInfo: false,
            pageSize: int.MaxValue,
            lastItem: new ItemSpec(item.ServerItem, RecursionType.None));
    
        string previousServerItem = changes.Single().Item.ServerItem;
    
        //Yep, this passes
        Trace.Assert(item.ServerItem != previousServerItem);
    
        return previousServerItem;
    }
    

    它会像这样使用:

    if (change.ChangeType.HasFlag(ChangeType.Rename))
    {
        string oldServerPath = GetPreviousServerItem(vcs, change.Item);
        // ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 2021-11-13
      相关资源
      最近更新 更多