Можем ли мы получить определенный файл с сервера git с помощью libgit2sharp?

Допустим, у нас где-то есть репозиторий git (на самом деле это будет сервер git, который мы запускаем). В этом репозитории у нас есть файл foo.txt, который несколько раз редактировался. Используя LibGit2Sharp, как мы можем получить последнюю версию foo.txt (или любого указанного файла) с сервера для просмотра?

(Обратите внимание, что этот процесс будет использоваться в приложении с очень большим объемом, поэтому эффективность идеальна, и мы хотели бы избежать получения большего количества данных с сервера, чем только сам файл).

Я просмотрел документацию и (отчасти потому, что я все еще не очень хорошо знаком с git) не могу понять, как это можно сделать. Я знаю, что есть команда git unpack-file <blob>, похоже, это может быть то, что я хочу. Есть ли способ воспроизвести это поведение с помощью LibGit2Sharp?

Кроме того, если мы можем это сделать, есть ли способ получить конкретную версию foo.txt, а не только последнюю версию?


person wlyles    schedule 17.06.2014    source источник
comment
Какое программное обеспечение вы будете использовать для запуска сервера Git? Большинство из них предлагают способ загрузки файлов через HTTP, например. https://raw.githubusercontent.com/<user>/<repo>/<hash>/path/to/file или https://gitlab.com/<user>/<repo>/raw/<hash>/path/to/file.   -  person Chris    schedule 17.06.2014
comment
@Chris У вас есть предложения или вы знаете, где искать такое программное обеспечение?   -  person wlyles    schedule 18.06.2014
comment
Это зависит от того, где вы будете его запускать, какие функции вам нужны и сколько вы готовы заплатить. Двумя популярными бесплатными вариантами являются GitLab (размещенный на хостинге Ruby on Rails, хорошо работает в Linux). и Bonobo Git Server (собственный хост, IIS, Windows).   -  person Chris    schedule 18.06.2014


Ответы (1)


Протокол git не позволит вам напрямую получить доступ к определенному BLOB-объекту по сети (однако, как указал Крис, некоторый веб-интерфейс git может предоставить API, который позволит вам это сделать).

Чтобы добиться этого с помощью LibGit2Sharp, вам придется клонировать репозиторий локально (т. е. получить полную историю) или получить коммиты, которые были отправлены вверх по течению и которых нет в вашем ранее клонированном репозитории (т. е. получить последние изменения).

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

string clonedRepoPath = Repository.Clone(remoteRepositoryUrl, localPath);

using (var repo = new Repository(clonedRepoPath))
{
    var masterBranch = repo.Branches["master"];
    var latestCommit = masterBranch.Tip;

    var blob = latestCommit["path/to/your/file.txt"].Target as Blob;

    Console.WriteLine(blob.GetContentText());
}

Если вы хотите конкретную ревизию, а не последнюю фиксацию конкретной ветки, следующее должно вам помочь.

var specificCommit = repo.Lookup<Commit>("e90810b");

Это позволит получить фиксацию, указанную указанным коротким ша. Как бы то ни было, метод Lookup() поддерживает расширенный синтаксис SHA1 git rev-parse< /а>.

С точки зрения «эффективности», если вас интересует конкретный удаленный репозиторий, вы можете сделать следующее:

person nulltoken    schedule 17.06.2014
comment
Спасибо за вклад; к сожалению, это не то решение, которое нам нужно. Похоже, мне придется изучить использование HTTP REST, как это было предложено в комментарии Криса к моему вопросу. Есть ли у вас какие-либо предложения по серверному программному обеспечению или где искать эту информацию? - person wlyles; 18.06.2014
comment
Спасибо за информацию, но да, это кажется ужасно неэффективным. Мы хотим прочитать один конкретный файл для получения примечаний к выпуску из каждого из примерно 30 репозиториев. Клонирование всех из них для нас — нонстартер. Мне тоже придется продолжить расследование. - person Dan Csharpster; 09.12.2016