首页 > 解决方案 > 使用 .Net Framework v4.8 和 Visual Studio 2019 查询 TFS 2015 源代码存储库日期时间属性

问题描述

我正在尝试筛选在特定时间段内在特定 Team Foundation Server 2015 分支上创建或修改的源代码控制文件。到目前为止,我能够通过 Microsoft.VisualStudio.Services.WebAPI 和 Microsoft.TeamFoundation.SourceControl.WebApi 库以及使用 GitHttpClient 类的 C# .Net Framework 4.8 控制台应用程序访问文件属性(例如 url)。

此类的 GetItemsAsync() 方法返回一个“GitItems”列表,其中包含一个“路径”属性,该属性可以作为参数传递到 System.IO 类 FileInfo 以实例化具有我需要的属性的对象:CreationTime 和 LastWriteTime。但是,GitItem 对象不包含 FileInfo(以及 File 类)准确生成这些属性所需的完整文件 (blob) 路径。path 属性只包含文件名(例如'/.gitignore')。因此,在下面的代码中,变量 lastWriteTime 和 CreationTime 属性都返回“12/31/1600 7:00:00 PM”,因为无法识别路径。

    static void Main(string[] args)
    {
        VssCredentials creds = new VssClientCredentials();
        creds.Storage = new VssClientCredentialStorage();

        VssConnection connection = new VssConnection(new Uri(teamCollection), creds);

        // Get a GitHttpClient to talk to the Git endpoints
        GitHttpClient gitClient = connection.GetClient<GitHttpClient>();

        // Get data about a specific repository
        var repositories = gitClient.GetRepositoriesAsync(teamProject).Result;

        GitVersionDescriptor descriptor = new GitVersionDescriptor()
        {
            VersionType = GitVersionType.Branch,
            Version = "develop",
            VersionOptions = GitVersionOptions.None
        };

        foreach (var repository in repositories)
        {

            var branches = gitClient.GetBranchesAsync(repository.Id).Result;
            var items = gitClient.GetItemsAsync(repository.Id, recursionLevel: VersionControlRecursionType.Full, versionDescriptor: descriptor, includeContentMetadata: true).Result;

            foreach (var item in items)
            {
                var fullPath = Path.GetFullPath(item.Path);
                FileInfo file = new FileInfo(fullPath);
                DateTime lastWriteTime = file.LastWriteTime;
            }
            Console.WriteLine(repository.Name);
        }
    }
}

}

标签: c#.nettfs-2015visual-studio-2019tfs-sdk

解决方案


根据您的代码,您正在使用 GitHttpClient.GetItemsAsync方法。

public Task<GitItemsCollection> GetItemsAsync(
    Guid repositoryId,
    string path,
    GitVersionDescriptor version,
    VersionControlRecursionType recursionLevel,
    bool includeContentMetadata,
    bool includeLatestChange,
    Object userState
)

这将返回一个服务器端 git 路径。具有 LastWriteTime 属性的文件信息类 获取或设置上次写入当前文件或目录的时间。这应该是本地系统路径。

这就是路径无法识别的原因。这可能会返回“12/31/1600 7:00:00 PM”的日期类型,

您的问题类似于此VSTS API - 存储库创建日期

不要认为可以获得手术create repo完成那一刻的确切日期。但是,从逻辑上讲,存储库的生日通常被认为是它的第一个提交日期。

如果这就是您正在寻找的,您可以使用通常的 Git 命令来实现您的目标:

git log -1 --reverse --format="format:%ci"

此外,您还可以通过Rest API获得带有详细信息的 git commit 。也看看这个博客,这可能会有所帮助。


推荐阅读