Получить основной идентификатор коммиттера / автора GIT, полученный от клиента TeamFoundation.SourceControl.WebApi - PullRequest
2 голосов
/ 12 июня 2019

Мы создаем приложение, которое собирает коммиты, сделанные определенными людьми за определенный месяц, и архивирует их.

Для этого используется клиент TFS из пространства имен TeamFoundation.SourceControl.WebApi. Он работает довольно хорошо, когда нужно найти сделанные изменения (он находит изменения как 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).

1 Ответ

0 голосов
/ 18 июня 2019

Самый простой способ - использовать push, а не коммит.Коммит - это просто запись информации, которую Git отслеживает для коммитов.Push-запросы и / или Pull-запросы имеют идентификаторы пользователей TFS для тех, кто их создал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...