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

时间:2012-12-14 19:01:31

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

我在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."

3 个答案:

答案 0 :(得分: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阅读项目和解决方案并使用它来过滤有趣的文件名。

答案 1 :(得分: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以获得相同的结果。

答案 2 :(得分:0)

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

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

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