Ответ 1
Начиная с Git версии 2. 5+ (2 квартал 2015 г.), получение одного коммита (без клонирования полного репо) действительно возможно.
См. Коммит 68ee628 Фредрика Медли (moroten
), 21 мая 2015 г.
(Объединено Junio C Hamano - gitster
- в коммите a9d3493, 01 июня 2015 г.)
Теперь у вас есть новый конфиг (на стороне сервера)
uploadpack.allowReachableSHA1InWant
Разрешить
upload-pack
для принятия запроса на выборку, который запрашивает объект, доступный из любой ссылки ref. Тем не менее, обратите внимание, что вычисление достижимости объекта вычислительно дорого.
По умолчаниюfalse
.
Если вы объедините эту конфигурацию на стороне сервера с мелким клоном ( git fetch --depth=1
), вы можете запросить один коммит (см. t/t5516-fetch-push.sh
:
git fetch --depth=1 ../testrepo/.git $SHA1
Вы можете использовать команду git cat-file
чтобы увидеть, что был получен коммит:
git cat-file commit $SHA1
"
git upload-pack
", который обслуживает "git fetch
", можно сказать, чтобы он обслуживал коммиты, которые не находятся на кончиках ссылок, если они доступны из ссылки, с помощью переменной конфигурацииuploadpack.allowReachableSHA1InWant
.
Полная документация:
upload-pack
: опционально разрешить выборку доступного sha1С
uploadpack.allowReachableSHA1InWant
конфигурацииuploadpack.allowReachableSHA1InWant
установленным на стороне сервера, "git fetch
" может сделать запрос со строкой "want", которая называет объект, который не был объявлен (вероятно, был получен вне диапазона или из указателя подмодуля),
Только объекты достижимы от кончиков ветки, то есть объединение рекламируемых ветвей и ветвей, спрятанныхtransfer.hideRefs
, будут обработаны.
Обратите внимание, что это связано с необходимостью обходить историю, чтобы проверить достижимость.Эта функция может использоваться при получении содержимого определенного коммита, для которого известен sha1, без необходимости клонирования всего хранилища, особенно если используется мелкая выборка.
Например, полезные случаи
- репозитории, содержащие большие файлы в истории,
- получение только необходимых данных для проверки субмодуля,
- при совместном использовании sha1, не сообщая, к какой именно ветки он принадлежит, и в Gerrit, если вместо чисел изменений вы думаете о коммитах.
(Случай Gerrit уже был разрешен с помощьюallowTipSHA1InWant
поскольку каждое изменение Gerrit имеетallowTipSHA1InWant
.)
Git 2.6 (3 квартал 2015 года) улучшит эту модель.
Смотрите коммит 2bc31d1, коммит cc118a6 (28 июля 2015 г.) Джеффа Кинга (peff
).
(Объединено Junio C Hamano - gitster
- в коммите 824a0be, 19 августа 2015 г.)
refs
: поддержка отрицательногоtransfer.hideRefs
Если скрыть иерархию рефов с помощью
transfer.hideRefs
конфигурации, нет никакого способа, чтобы позже переопределить конфигурации для "UNHIDE" его.
Этот патч реализует "отрицательное" скрытие, которое заставляет совпадения немедленно помечаться как скрытые, даже если другое совпадение скрыло бы это.
Мы позаботимся о том, чтобы применить совпадения в обратном порядке по сравнению с тем, как они передаются нам механизмом конфигурации, поскольку это позволяет нашему обычному приоритету конфигурации "последний выиграл" (и записи в.git/config
, например, переопределят/etc/gitconfig
).Итак, теперь вы можете сделать:
git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'
скрывать
refs/secret
во всех репо, кроме одного публичного бита в одном репо.
Git 2.7 (ноябрь/декабрь 2015) снова улучшится:
См. Коммит 948bfa2, коммит 00b293e (05 ноября 2015 г.), коммит 78a766a, коммит 92cab49, коммит 92cab49, коммит 92cab49 (03 ноя 2015 г.), коммит 00b293e, коммит 00b293e (05 ноября 2015 г.) и коммит 92cab49, коммит 92cab49, коммит 92cab49, совершить 92cab49 (3 ноября 2015 г.) Лукасом Флейшером (lfos
).
Помогает: Эрик Саншайн (sunshineco
).
(Объединено Джеффом Кингом - peff
- in commit dbba85e, 20 ноября 2015 г.)
config.txt
: документировать семантикуhideRefs
с пространствами именПрямо сейчас, нет четкого определения того, как
transfer.hideRefs
следует вести себя, когда пространство имен устанавливается.
Объясните, что в этомhideRefs
префиксыhideRefs
соответствуютhideRefs
именам. Вот как шаблоныhideRefs
в настоящее время обрабатываются в receive-pack.hideRefs: добавить поддержку для сопоставления полных ссылок
В дополнение к сопоставлению разделенных
hideRefs
теперь можно добавить шаблоныhideRefs
, с которыми сопоставляется полный (необрезанный) ref.
Чтобы различать разделенные и полные совпадения, эти новые шаблоны должны иметь префикс с кружком (^
).
Отсюда новая документация:
transfer.hideRefs:
Если пространство имен используется префикс пространства имен удаляется из каждой ссылки, прежде чем он будет сопоставлен с
transfer.hiderefs
узорами.
Например, еслиrefs/heads/master
задаются вtransfer.hideRefs
и текущее пространство именfoo
, тоrefs/namespaces/foo/refs/heads/master
опускаются от рекламы, ноrefs/heads/master
иrefs/namespaces/bar/refs/heads/master
по-прежнему рекламируются как так называемые строки "иметь".
Чтобы сопоставить ссылки перед удалением, добавьте^
перед именем ссылки. Если вы объедините!
и^
!
должен быть указан первым.
В комментариях R упоминает конфигурацию uploadpack.allowAnySHA1InWant
, которая позволяет upload-pack
принимать запрос на fetch
который вообще запрашивает какой-либо объект. (По умолчанию false
).
Смотрите коммит f8edeaa (ноябрь 2016, Git v2.11.1) Дэвида "novalis" Тернера (novalis
):
upload-pack
: опционально разрешить выборку любого sha1Кажется немного глупым делать проверку достижимости в случае, когда мы доверяем пользователю получить доступ ко всему, что есть в хранилище.
Кроме того, это довольно редко в распределенной системе - возможно, один сервер объявляет ссылку, но с тех пор другой сервер принудительно подталкивает эту ссылку, и, возможно, два HTTP-запроса в конечном итоге направляются на эти разные серверы.