c# - 使用 .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);
}
}
}
}
解决方案
根据您的代码,您正在使用 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 。也看看这个博客,这可能会有所帮助。