Можно ли дать команду git fetch pack для получения одного объекта дерева?

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

Больше контекста: из-за отсутствия поддержки GitHub спецификаций фильтра в протоколе пакетов я пытался создать способ получения хранилища с несколькими гигабайтами, в котором один коммит также состоит из нескольких гигабайт. Моя идея состояла в том, чтобы использовать запросы пакетов извлечения (или загрузить пакет на сервер), которые указывают want только один объект коммита и оттуда получить этот объект, получить дерево, на которое он ссылается, получить объект дерева в другом запросе, а затем вручную указать, какие объекты blob и tree мне нужны. Однако я обнаружил, что протокол пакета, по-видимому, работает с точки зрения доставки как можно большего количества данных для конкретного коммита или дерева, которое вы "хотите".

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

2 ответа

Решение

То, что вы запрашиваете, невозможно в протоколе Git, если не включена функция фильтра.

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

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

Вы можете указать, что вы have некоторые объекты дерева, чтобы исключить их, но, конечно, это требует, чтобы вы знали, какие они есть, а в данном случае - нет. Тем не менее, вы все равно получите капли, которые существуют на этом уровне иерархии.

Функциональность фильтра просто настраивает объекты, включенные в пакет, так что вы можете указать, что должен быть включен только один объект дерева, исключив все, что находится ниже его глубины. Эти аргументы передаются git rev-list --objects так что генерация пакета исключит то, что вас не интересует. В противном случае по умолчанию включается каждый достижимый объект в пределах запрошенного вами диапазона.

Вы спрашиваете, как обращаться с удаленным репозиторием как с локальным объектом db. Способ сделать это - получить доступ файловой системы к объекту db удаленного репозитория, скажем, путем включения в систему системы с установленным этим объектом db или монтирования файловой системы, содержащей его локально.

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

Да, в противном случае вы получите сломанный репозиторий. Если вы хотите этого, вы можете сделать это, как упомянуто выше, обойти проверки целостности Git и просто запустить pack-объекты самостоятельно на смонтированном объекте db, который принимает произвольные sha на stdin и записывает пакет точно с теми объектами, которые вы запрашивали. Перетащите выходной пакет в любые объекты репозитория dir и вуаля, в этом хранилище есть эти объекты.

Другие вопросы по тегам