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

4

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

"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."
3个回答

3
您可以使用 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。您可以传递两个路径(两者都可以在服务器上),尽管文档没有清楚地指定,但可以像这样添加versionspec:
 tf folderdiff $/Path/To/Project;C1071 $/Path/To/Project;T /recursive

你可以附加日期、Changeset编号、标签名称等,具体的示例请参见此处的文档
如果你想知道如何实现此功能,请考虑使用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可获得相同的结果。


0

我不太确定为什么@Alex删除了他的答案,因为它基本上是一个很好的开始。

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

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


他的问题是如何在C#中使用API实现,我开始看漏了那一部分,我的答案没有满足他的需求。 - Alex
啊,我也错过了这个... 快速的答案是 Process.Start("tf.exe") :-) 对于 TFS API,同样的方法也适用,所以也许像 这个 这样的东西可以帮助你入门。 - Jason Williams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接