4

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

3 回答 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对阅读项目和解决方案的支持,并使用它来过滤有趣的文件名。

于 2012-12-14T20:40:43.017 回答
2

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

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

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

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

此处记录了您可以使用的示例。它包括日期、变更集编号、标签名称等。

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

我有一篇博文详细解释了 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 来获得相同的结果。

于 2012-12-14T19:33:55.030 回答
0

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

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

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

于 2012-12-14T19:55:22.550 回答