【问题标题】:Get the master identity of a GIT commiter / author received from TeamFoundation.SourceControl.WebApi client获取从 TeamFoundation.SourceControl.WebApi 客户端收到的 GIT 提交者/作者的主身份
【发布时间】: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 数据库中四处寻找,似乎有一个带有本地主身份映射的表,正如我的问题所述。

标签: git tfs


【解决方案1】:

最简单的方法是使用推送而不是提交。提交只是 Git 跟踪提交的信息的记录。推送和/或拉取请求具有创建它们的基于 TFS 用户的身份。

【讨论】:

  • 虽然这是真的,但一次推送/拉取可以有多个提交,并且正在开发的应用程序必须备份特定人在给定月份所做的更改。这意味着此信息没有所需的粒度。此外,虽然用户可能只会将他们自己的更改从他们的机器推送到 TFS 服务器上,但分支可能会被拉入许多人工作的东西中。无论如何,我会仔细检查推/拉信息是否足够。
  • 推送是我所知道的唯一一点,它可以在 API 中访问经过身份验证的信息,尽管它列出了推送中的提交。唯一的另一种选择是放置一个推送挂钩,在允许推送之前验证提交的提交者信息。我们实际上是在我们的环境中执行此操作的,但这是一个文档记录很差的过程,需要将 dll 添加到插件文件夹中,并且需要重新启动 iis 才能更新挂钩。
  • 另外,GitCommit 似乎确实有一个指向发起它的推送的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
相关资源
最近更新 更多