Как я могу получить один файл с указанным c коммитом (ха sh) из удаленного git репозитория? - PullRequest
1 голос
/ 18 февраля 2020

Я хотел бы получить файл при фиксации из удаленного репозитория git без извлечения всех объектов в репозитории. Я знаю, что git archive не работает, так как он может только получить кончик ветви.

С помощью sparse-checkout и использования протокола v2 (спасибо @ bk2204) я могу создать рабочее дерево только с файлом readme. при коммите, но git передает 10 с тысяч объектов и 188 МБ.

mkdir linux
cd linux
git init
git config core.sparseCheckout true
git config protocol.version 2
git remote add origin git@github.com:torvalds/linux.git
echo "/README" > .git/info/sparse-checkout
git fetch --depth 1 origin ab02b61f24c76b1659086fcc8b00cbeeb6e95ac7
git checkout ab02b61f24c76b1659086fcc8b00cbeeb6e95ac7
remote: Enumerating objects: 71432, done.
remote: Counting objects: 100% (71432/71432), done.
remote: Compressing objects: 100% (66651/66651), done.
remote: Total 71432 (delta 5277), reused 25451 (delta 3920), pack-reused 0
Receiving objects: 100% (71432/71432), 188.85 MiB | 7.71 MiB/s, done.
Resolving deltas: 100% (5277/5277), done.

В идеале эта операция должна получить 3 объекта - коммит (известный sha)> дерево коммита> файл в дереве

$ git cat-file -p ab02b61f24c76b1659086fcc8b00cbeeb6e95ac7 | grep tree
tree f6760b0bf32bd3b9a760d6e895c7fb76cd9c2ef8
$ git cat-file -p f6760b0bf32bd3b9a760d6e895c7fb76cd9c2ef8 | grep README
100644 blob 669ac7c32292798644b21dbb5a0dc657125f444d    README
$ git cat-file -p 669ac7c32292798644b21dbb5a0dc657125f444d

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Как правило, вы не можете получать отдельные объекты без частичной поддержки клонирования. Протокол не позволяет этого. Разреженная проверка не мешает вам получить все данные, она просто не дает вам проверить все это.

Я не знаю ни одного крупного Git хостинг-провайдера, который обычно имеет частичную поддержку клонирования прямо сейчас, хотя я подозреваю, что это будет в ближайшее время. Эта функция все еще относительно экспериментальна.

Однако, если вы используете пульт, поддерживающий протокол v2, вы можете получить указанный c коммит, даже если вы обычно не сможете без протокола v2 , Вы можете запустить git config protocol.version 2, и тогда вы сможете получать отдельные коммиты по ha sh. Выполнение этого с --depth 1 было бы лучшим, что вы могли бы сделать в данном конкретном случае.

0 голосов
/ 18 февраля 2020

Предполагается, что хостинговая служба имеет API для загрузки файла ревизии или получения его содержимого. Например, Gitlab имеет GET / projects /: id / repository / files /: file_path / raw , а Github имеет GET / repos /: owner /: repo / contents /: path, а у Геррита есть GET /projects/ndomproject-name отпуска/commits/ndomcommit-id‹/files/ndomfile-id coming/content.

Для простого самостоятельного хостинга хранилище, чтобы получить случайный коммит или объект с помощью git fetch, вы можете установить uploadpack.allowReachableSHA1InWant=true или uploadpack.allowAnySHA1InWant=true. В большинстве случаев они ложны (по умолчанию) для безопасности и производительности. Для самостоятельного хостинга Gerrit, он имеет аналогичные параметры конфигурации. Я понятия не имею о самодостаточном Gitlab.

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