如何检测TFS项目源代码已被修改

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

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

在C#中使用TFS API来做到这一点的最佳方法是什么?

我的想法:从TFS获取所有项目项目,为每个项目检查它的更改历史logging。 根据给定的范围周期过滤历史logging。 如果这段时间有变化,那么这个文件就被修改了,所以这个项目已经被修改了。 它是否正确?

是否有可能做同样的事情,但不是在一段时间内search,而是在一系列变化集合中search? 例如:

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

您可以使用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支持下阅读Projects和Solutions,并用它来过滤有趣的文件名。

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

你将要面对的另一个问题是,项目目录下的源代码管理中的所有文件都不必包含在项目中。

现在,如果你不关心这些情况,最简单的方法是使用tf命令行tf folderdiff。 你可以将它传递给两个路径(这两个路径都可以在服务器上),虽然文档没有明确指出,但你可以像这样修改一个versionspec:

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

在这里记录下你能做什么的例子。 它包括日期,更改集号码,标签名称等

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

我有一个博客文章,解释了一些关于tf folderdiff命令以及如何使用它。

拥有魔法的班级在这里:

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

这是内部的,所以你可以看看它是如何完成的,但是没有简单的API来获得相同的结果。

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

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

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