получить репозиторий git для определенного коммита без клонирования

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

Хэш фиксации находится в URL-адресе - либо wget, либо curl могут/должны быть рекурсивно извлечены, но у меня такое ощущение, что github блокирует это, поскольку все, что я когда-либо получал, это robots.txt

Репо и коммит:

https://github.com/phalcon/cphalcon/tree/1d6d21c98026b5de79ba5e75a3930ce7ed1ebcd

ошибка моей лучшей попытки:

git fetch https://github.com/phalcon/cphalcon/ 1d6d21c98026b5de79ba5e75a3930ce7d1ebcd2e
error: Server does not allow request for unadvertised object 1d6d21c98026b5de79ba5e75a3930ce7d1ebcd2e

обновить

Предложения ответов, в которых используется клон, не отвечают на вопрос. Я могу клонировать/проверить без проблем. Попытка сделать это, не имея всего репо локально


person Christian Bongiorno    schedule 13.09.2017    source источник
comment
Возможный дубликат Как клонировать репозиторий git с определенной версией/набором изменений?   -  person jonrsharpe    schedule 14.09.2017
comment
Используйте теги, люди!   -  person o11c    schedule 14.09.2017
comment
У вас может быть такой вариант: developer.github.com/v3/ git/trees (предупрежу, что пользоваться им мучительно, мелкое клонирование гораздо проще и продуктивнее).   -  person torek    schedule 14.09.2017
comment
@torek определенно выходит за рамки! Спасибо за предложение, хотя   -  person Christian Bongiorno    schedule 14.09.2017


Ответы (1)


Вам понадобится репозиторий Git по причине, указанной в сообщении об ошибке:

error: Server does not allow request for unadvertised object ...

«Нерекламируемый объект» — это тот, к которому напрямую не привязано имя. (Если бы у объекта было имя, вы могли бы запросить названную вещь, и сервер выдал бы вам объект. Это предполагает, что жалоба типа «Я не допускаю сюда синих кошек» подразумевает « Я допускаю некоторые другие цвета кошек", что тоже не обязательно верно, но является своего рода разумным предположением.1) Это означает, что вы должны получить объект каким-то непрямым способом, т.е. git fetch.

Репозиторий, который вам нужен, по определению является клоном — или, по крайней мере, частичным клоном — исходного репозитория. Вы можете использовать поверхностный клон, который является неполным. Вы не можете вычислить заранее, какая именно глубина необходима: кто-то, у кого есть полный клон, может вычислить это, и как только у вас будет достаточно глубокий клон, вы сможете найти точное число. Но если ваш клон слишком поверхностен, все, что вы знаете, это то, что он слишком поверхностен.

См. также Git получает конкретную фиксацию по хешу и мелкий клон git (clone --depth) пропускает удаленные ветки. Обратите внимание, что вы можете хотеть или не хотеть --single-branch. Клонируйте с некоторой глубиной и посмотрите, достаточно ли этого, а если нет, увеличьте глубину с помощью git fetch --depth <bigger-number>, пока она не будет достаточной.


1На самом деле, эта логика, по-видимому, является истинным источником фразы «исключение, подтверждающее правило»: она происходит от латинской фразы Exceptio probat regulam in casibus non excludeis. См. https://pocketbookuk.com/tag/cicero/ и этот ответ на english.stackexchange.com, чтобы узнать больше об этом.

person torek    schedule 13.09.2017