Получение списков файлов удаленного репозитория Git - PullRequest
0 голосов
/ 08 апреля 2019

Я работаю с GitLab и пытаюсь решить проблему с извлечением информации из файла.Я пытался понять это, и я не могу найти способ.Моя среда - C #, .Net Core / Standard.Вот мои требования и несколько вещей, которые я попробовал.

  1. Никакие файлы (или имена файлов) не могут касаться диска на моей стороне.Все это должно храниться в памяти.

  2. Мне нужно иметь возможность вытягивать все группы / проекты с заданного пути вниз. Я решил это с помощью API GitLab - https://{0}/api/v4/groups/{1}/subgroups?per_page=100&page={2} и https://{0}/api/v4/groups/{1}/projects?per_page=100&page={2}.

  3. Мне нужно иметь возможность извлекать все файлы для этих проектов.Я решил это, но решение не совсем приемлемо.Я извлекаю из https://{0}/api/v4/projects/{1}/repository/tree?recursive=true&per_page=100{2} и выполняю некоторую сложную работу, получая максимальное количество страниц и многопоточность своих вызовов, чтобы получить все страницы.Проблема в том, что я смог поставить наш GitLab на колени со слишком большим количеством нитей, так что мне пришлось это задушить.С ограничением в 100 на страницу и некоторыми проектами, которые я вытащил, имея> 300 тыс. Файлов, это медленный процесс.Для одного репо требуется> 30 минут, чтобы ПРОСТО вытащить список файлов.Это также увеличивает нагрузку на инфраструктуру GitLab.

  4. Мне нужно извлекать отдельные файлы.Я решил это, используя https://{0}/api/v4/projects/{1}/repository/files/{2}/raw?ref={3}, и он работает довольно хорошо.

  5. Мне нужно иметь возможность получить список файлов, которые изменились (или были добавлены) после указанной даты/ время, чтобы я мог оценить дельты с момента моего последнего прохода.Я еще не совсем решил эту проблему, но из того, что я могу найти до сих пор, мне придется использовать https://{0}/api/v4/projects/{1}/repository/commits?ref={2}&since={3}&per_page=100&page={4}, чтобы получить список коммитов с момента ввода даты / времени.Затем мне нужно будет использовать https://{0}/api/v4/projects/{1}/repository/files/{2}?ref={3}, чтобы получить метаданные для КАЖДОГО файла из шага 3. Это означает, что мне придется делать вызов для каждого файла, чтобы дополнительно загрузить нагрузку на сервер GitLab.

Есть ли лучший способ решить # 3 и # 5?

Обновление 1

Я пытался использовать метод, описанный в Какя получаю список всех файлов и их SHA1 из удаленного репозитория Git? , но я получил второй запрос на вход в систему, а затем получил: The command you're trying to execute is not allowed. Есть ли что-то, что нужно включить на стороне сервера, чтобы это разрешить?

Обновление 2

Метод в Обновлении 1 - это "тупой" протокол http git.Это отключено в нашей инфраструктуре.Мы используем протокол Smart HTTP.Я искал, но я не могу найти, как сделать git ls с использованием протокола Smart HTTP.У кого-нибудь есть пример?

...