【问题标题】:Programmatically find a moved file by the old name以编程方式按旧名称查找移动的文件
【发布时间】:2012-04-05 13:08:16
【问题描述】:

an answer to another question 中,Edward Thomson 建议使用 QueryItems 按旧文件名查找已移动文件。

但是,我似乎无法弄清楚这一点。看起来它是Microsoft.teamfoundation.versioncontrol.server.dll 的一部分,但我似乎无法在任何地方找到它。我想知道这是否是 TFS 服务器本身的 DLL(我目前无权访问)。如果是这样,它不会帮助我满足我的需要。

如何通过 TFS 2010 中的旧文件名以编程方式查找移动的文件名?

【问题讨论】:

  • 抱歉,正如 jessehouwing 在下面正确指出的那样,我的意思是 GetItems 方法调用。 (曾几何时,TFS Java SDK 将该方法称为“查询项目”,以消除 下载项目Get... 方法的歧义。我无可救药地陷入了过去。)已经更新了原始答案以反映。

标签: tfs


【解决方案1】:

我认为他实际上是指

的 GetItem(s) 或 QueryHistory 方法
Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer
Namespace:  Microsoft.TeamFoundation.VersionControl.Client
Assembly:  Microsoft.TeamFoundation.VersionControl.Client (in Microsoft.TeamFoundation.VersionControl.Client.dll)

有关这些项目的更多信息,请参阅this msdn page。您可以指定可以包含删除标识符的 VersionSpec。如果我没记错的话,如果你想对旧版本的 TFS 使用这段代码,你需要小心。在 TFS2010 中引入了 slotmode,效率更高,并且可以跟踪跨版本的文件名更改。在此之前,重命名基本上归结为旧版本的删除和新版本的添加,没有存储任何关系。

【讨论】:

  • 是的——我确实是说GetItems,谢谢你的澄清。关于 TFS2010 和 pre-2010 之间重命名处理的差异的一个小注意事项(比其他任何事情都更琐碎):在 TFS2010 中,它实际上比以前更像添加和删除。 (您会看到这反映在源具有“删除,源重命名”待更改的删除的待处理更改中。)这实际上更容易解决“我的文件去了哪里”的问题,因为您可以查询删除id。在 TFS2008 (IIRC) 中,您必须在已知存在的版本中查询旧文件名。
  • 我无法通过将旧文件名传递到 GetItems 或 QueryHistory 来获取新文件名。我将更改集返回到重命名(包括重命名),但我没有看到任何返回新文件名的成员。我也看不到重命名后的任何变更集。我做错了吗?
【解决方案2】:

如果您正在与之交谈的服务器至少是 TFS 2010,那么您可以使用 Microsoft.TeamFoundation.VersionControl.Client.VersionControlServer.GetChangesForChangeset() 来执行此操作。一旦使用 QueryHistory 确定重命名发生的变更集,调用 GetChangesForChangeset 并为“includeMergeSourceInfo”参数传递“true”。这将填充每个 Change 对象的“MergeSources”属性。

在 2010 年切换到“插槽模式”后,TFS 版本控制中的重命名非常类似于幕后的“分支和删除”操作。因此,重命名实际上是作为“合并历史”的一部分进行跟踪的。

因此,如果您遍历更改并找到具有 MergeSource 的更改,该 MergeSource 既是重命名(请参阅 IsRename 属性)并且具有您的源项,那么您将找到重命名操作的目标项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    相关资源
    最近更新 更多