Как подключиться к репозиторию GitHub с помощью libgit2?

Я пытаюсь подключиться к репо:

using(var Git = new Repository(
    Repository.Clone("https://github.com/wikimedia/mediawiki-core", "tmp")
)){
    foreach(var Commit in Git.Commits)
    {
        MessageBox.Show(Commit.Author.Name);
    }
}

Он подключается нормально (например, если я изменяю URL, я получаю ожидаемое исключение), но нет MessageBoxони показаны - почему? Это должно быть просто.

1 ответ

Решение

Несколько вещей, чтобы рассмотреть относительно вашего вопроса:

  • Нельзя "подключиться" к удаленному репозиторию и динамически получить один файл по протоколам git. Обычно ожидается получение локальной копии (через Repository.Clone()) затем выполнить некоторую работу против локального хранилища.
  • Mediawiki-core - довольно большой репозиторий. Он содержит более 10000 коммитов. Таким образом, клонирование может занять довольно много времени. Можно получить некоторое представление о прогрессе клонирования, предоставив Clone() метод с обработчиком прогресса передачи.
  • @ CarlosMartínNieto прав. Если вам нужен только один файл (а не вся история репозитория), использование API GitHub действительно будет более эффективным. Обратите внимание, что использование этого API регулируется некоторыми ограничениями скорости, которые вы можете рассмотреть, в зависимости от предполагаемого использования.

Приведенный ниже код (в значительной степени основанный на вашем собственном коде) клонирует удаленный репозиторий, выводит текущий прогресс клонирования на консоль и перечисляет коммиты, доступные из HEAD,

Он был успешно протестирован с пакетом NuGet LibGit2Sharp v0.14.1.

public void CloneAndEnumerateCommitsFromHead()
{
    var tmp = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());

    string path = Repository.Clone(
        "https://github.com/nulltoken/TestGitRepository", 
        tmp,
        onTransferProgress: ProgressHandler);

    using (var Git = new Repository(path))
    {
        foreach (var Commit in Git.Commits)
        {
            Console.WriteLine("{0} by {1}",
                Commit.Id.ToString(7),
                Commit.Author.Name);
        }
    }
}

private int ProgressHandler(TransferProgress progress)
{
    Console.WriteLine("{0}/{1}", progress.IndexedObjects, progress.TotalObjects);
    return 0;
}

При запуске выдает следующее

0/70
1/70
2/70
2/70
...snipped for brevity...
68/70
69/70
70/70
70/70
49322bb by A U Thor
d0114ab by A U Thor
f73b956 by A U Thor
6e14752 by A U Thor
1203b03 by A U Thor
bab66b4 by A U Thor
83834a7 by A U Thor
6462e7d by A U Thor
42e4e7c by A U Thor
7f82283 by A U Thor
59706a1 by A U Thor
c070ad8 by A U Thor
d31f5a6 by A U Thor
83d2f04 by A U Thor
6db9c2e by A U Thor
d86a2aa by A U Thor
0966a43 by A U Thor
2c34933 by A U Thor
ac7e7e4 by A U Thor
58be465 by A U Thor
6c8b137 by A U Thor
Другие вопросы по тегам