【发布时间】:2019-10-27 00:36:56
【问题描述】:
我们正在创建一个应用程序,用于收集某些人在给定月份所做的提交并将其存档。
为了实现这一点,使用了来自 TeamFoundation.SourceControl.WebApi 命名空间的 TFS 客户端。它在查找所做的更改时工作得相当好(它同时查找 TFS 和 GIT 更改),但在某些结果细节(特别是 GIT 结果和GitUserDate 类)方面存在一些问题。结果似乎有本地指定的 GIT 用户名。由于这些不可靠,我们需要将它们映射到对服务器进行最终提交的用户的实际域名。一般来说,每个提交应该只有一个作者(在向服务器提交之前,某个人有多个作者在本地存储库上工作的可能性非常小)。
我知道这些信息应该在 TFS 中; TFS SQL 数据库中有一个IdentityMap 表,似乎保存了我们正在寻找的信息。但我们宁愿通过 API 获取这些信息,因为直接访问数据库感觉...不对。
有没有办法从 TFS API 获取这些信息?
PS。为了完整起见:我们使用的是本地 TFS。
编辑:这是一个代码示例:
var criteria = new GitQueryCommitsCriteria();
criteria.FromDate = startDate.ToString();
criteria.ToDate = endDate.ToString();
var commits = gitClient.GetCommitsBatchAsync(criteria, repository.Id).Result;
var itemList = new List<GitFile>();
if (commits.Select(x => x.Committer.Name).Count(x => users.Contains(x)) > 0)
{
foreach (var commit in commits)
{
var changes = gitClient.GetChangesAsync(commit.CommitId, repository.Id).Result;
foreach (var change in changes.Changes)
{
if (change.Item.GitObjectType == GitObjectType.Blob)
{
var item = new GitFile //this is a custom model class to help processing
{
Committer = commit.Committer.Name, //commit.Committer.Email was also attempted
Date = commit.Committer.Date,
RepositoryId = repository.Id,
RepositoryName = repository.Name,
FileName = change.Item.Path,
Item = change.Item
};
itemList.Add(item);
}
}
}
if (itemList.Count > 0)
{
ProcessGitFiles(itemList, startDate, users); //users is a list of internal user domain names for whom files needed to be processed and saved
}
}
一些错误示例:users 列表包含来自服务器的域名,这是我们可以依赖的。 Commiter.Name(或Commiter.Email)是由某人的git config 指定的本地值,至少在一种情况下,名称包含错字,而在其他情况下,电子邮件是别名电子邮件地址(通常是我们的用户公司会使用jdoe@domain 格式,但电子邮件也有别名格式john.doe@domain)。
【问题讨论】:
-
您能否准确分享您是如何获得提交的?
-
另外,您能否提供一个示例来说明您获得的本地用户名以及服务器上存在的“真实”用户名是什么?
-
@ShaykiAbramczyk 添加了示例,其中包括我们面临的问题的通用示例。
-
在 TFS 中,您看到的是本地名称/电子邮件还是“真实”名称/电子邮件?
-
@ShaykiAbramczyk 在 TFS Web UI 中显示本地电子邮件/名称。但是我在 TFS SQL 数据库中四处寻找,似乎有一个带有本地主身份映射的表,正如我的问题所述。