【问题标题】:How to detect that TFS Project Source Code has been modified如何检测 TFS 项目源代码已被修改
【发布时间】:2012-12-02 19:29:06
【问题描述】:

我在 TFS 中有一个可编译为 DLL 的 Visual Studio C# 项目。 我需要知道项目内的任何文件是否在一段时间内被修改过。 像这样的:

"from date 01/01/2011 to today,  check if the project has been modified."

在 C# 中使用 TFS API 执行此操作的最佳方法是什么?

我的想法:从 TFS 获取所有项目项,为每个项目检查其更改历史记录。根据给定的范围时段过滤历史记录。如果在那段时间有变化,那么那个文件就被修改了,因此项目也被改变了。这是正确的吗?

是否可以做同样的事情,但不是在一段时间之间进行搜索,而是在一系列变更集中进行搜索?例如:

"from changeset 1071 to latest,  check if the project has been modified."

【问题讨论】:

    标签: c# windows visual-studio-2010 tfs


    【解决方案1】:

    您可以使用QueryHistory 方法解决这些问题:

    var tfs = new TfsTeamProjectCollection(new Uri(@"http://tfs.example.com:8080"));
    var vc = tfs.GetService<VersionControlServer>();
    
    // DateTime fro, to;
    var changesets = from cs in vc.QueryHistory(
        "$/YourProject",
        VersionSpec.Latest,
        0,    /* deletion ID, 0 otherwise */
        RecursionType.Full,
        null, /* user, null for all */
        null, /* from changeset, null because these aren't by date */
        null, /* to changeset, null because these aren't by date   */
        Int32.MaxValue, /* get them all */
        false, /* just metadata */
        false /* just the current stuff */
        )
        where cs.CreationDate >= fro && cs.CreationDate <= to
        select cs;
    

    获得变更集列表后,您可以查询它们以获取与它们关联的文件。此时,如果您真的想排除误报,我会添加 Roslyn 支持阅读项目和解决方案,并使用它来过滤有趣的文件名。

    【讨论】:

      【解决方案2】:

      您在这里遇到的问题是项目可能包含不在同一个根文件夹中的文件。在大型解决方案中包含位于项目目录之外的文件是很常见的。

      您将面临的另一个问题是,并非项目目录下源代码管理中的所有文件实际上都必须包含在项目中。

      现在,如果您不关心这些情况,最简单的方法是使用 tf 命令行 tf folderdiff。您可以将两个路径传递给它(都可以在服务器上),尽管文档没有明确指定它,但您可以像这样添加一个版本规范:

       tf folderdiff $/Path/To/Project;C1071 $/Path/To/Project;T /recursive
      

      您可以在 are documented here 上添加的示例。它包括日期、变更集编号、标签名称等。

      如果您想知道这是如何完成的,请考虑查看 Reflector.NET 或 JustDecompile(或类似应用程序)中的 tf.exe 实用程序。他们使用与您相同的 API。或者直接使用 Process 类调用tf folderdiff 命令。

      我有一个blog post that explains a little more about the tf folderdiff command 以及如何使用它。

      拥有魔法的班级在这里:

       internal class FolderDiff : IEnumerable<FolderDiffFolder>, IEnumerable, IDisposable
      
       Name:     Microsoft.TeamFoundation.VersionControl.Controls.FolderDiff 
       Assembly: Microsoft.TeamFoundation.VersionControl.Controls, Version=11.0.0.0 
      

      它是内部的,因此您可以窥视它是如何完成的,但无法轻松访问 API 来获得相同的结果。

      【讨论】:

        【解决方案3】:

        我不太清楚为什么@Alex 删除了他的答案,因为这基本上是一个好的开始。

        按照他的建议,您可以在文件或整个文件夹层次结构上运行 tf.exe to get the history,并且可以将结果限制在两个版本之间,变更集 或日期。因此,如果您的项目是“正常的”并且几乎​​所有项目都驻留在单个根文件夹下,那么一个简单的方法就是在根文件夹上 tf history 以获取已更改文件的列表。您必须解析输出以确定哪些文件受到影响,但这是一项非常简单的任务 - 如果您只想知道“有什么改变吗?”,那就更容易了。

        正如@jessehouwig 所说,可能有您希望从其他位置考虑的文件,以及您不想考虑的项目文件夹中的文件。在这种情况下,您可能希望编写一个批处理文件或应用程序,多次调用 tf.exe 以更具体的方式收集信息。

        【讨论】:

        • 他的问题是如何使用 API 在 C# 中做到这一点,第一次阅读我错过了那部分,我的回答没有满足他的要求
        • 啊,我也错过了...快速的答案是 Process.Start("tf.exe") :-) 对于 TFS API,同样的方法也可以,所以也许像 this将帮助您入门。
        猜你喜欢
        • 2014-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-25
        • 2011-12-28
        • 1970-01-01
        相关资源
        最近更新 更多