Начиная с Git версии 2.5+ (второй квартал 2015 года), получение одного коммита (без клонирования полного репо) действительно возможно.
См. Коммит 68ee628 от Fredrik Medley ( moroten
) , 21 мая 2015 г.
(объединено с Junio C Hamano gitster
- в коммите a9d3493 , 01 июня 2015 г.)
Теперь у вас есть новый конфиг (на стороне сервера)
uploadpack.allowReachableSHA1InWant
Разрешить upload-pack
принимать запрос на выборку, запрашивающий объект, доступный из любой ссылки ref. Тем не менее, обратите внимание, что вычисление достижимости объекта является вычислительно дорогим.
Значения по умолчанию для false
.
Если вы объедините эту конфигурацию на стороне сервера с поверхностным clone ( 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
параметром конфигурации, установленным на стороне сервера, « git fetch
» может сделать запрос со строкой «хотеть», которая называет объект, который не был объявлен (вероятно, был получен вне диапазона или из указателя подмодуля). Будут обрабатываться
только объекты, доступные из подсказок ветвей, т.е. объединение объявленных веток и скрытых веток transfer.hideRefs
.
Обратите внимание, что это связано с необходимостью обходить историю, чтобы проверить достижимость.
Эта функция может использоваться при получении содержимого определенного коммита, для которого известен sha1, без необходимости клонирования всего репозитория, особенно если используется мелкая выборка .
Полезные случаи, например,
- репозитории, содержащие большие файлы в истории,
- получение только необходимых данных для проверки субмодуля,
- при совместном использовании sha1, не сообщая, к какой именно ветви он принадлежит, и в Gerrit, если вы думаете не в виде чисел, а в терминах коммитов.
(Случай с Gerrit уже раскрыт, так allowTipSHA1InWant
как каждое изменение Gerrit имеет ссылку.)
Git 2.6 (3 квартал 2015 года) улучшит эту модель.
Смотрите коммит 2bc31d1 , коммит cc118a6 (28 июля 2015 г.) Джеффа Кинга ( peff
) .
(Слиты Junio C Hamano - gitster
- в фиксации 824a0be , 19 Aug 2015)
refs
: поддержка отрицательная transfer.hideRefs
Если вы скрываете иерархию ссылок, используя transfer.hideRefs
конфигурацию, то позже невозможно переопределить эту конфигурацию, чтобы «показать» ее.
Этот патч реализует «отрицательное» скрытие, которое заставляет совпадения немедленно помечаться как скрытые, даже если другое совпадение скрыло бы это.
Мы позаботимся о том, чтобы применить совпадения в обратном порядке от того, как они передаются нам механизмом конфигурации, поскольку это позволяет нашему обычному приоритету конфигурации «последний выиграл» (и записи в .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 (03 ноября 2015 г.) Лукасом Флейшером ( lfos
) .
Помогает: Эрик Саншайн ( sunshineco
) .
(Слиты Джефф Кинг - peff
- в фиксации dbba85e , 20 ноября 2015)
config.txt
: документировать семантику hideRefs
с пространствами имен
В настоящее время нет четкого определения того, как transfer.hideRefs
вести себя, когда задано пространство имен.
Объясните, что hideRefs
в этом случае префиксы совпадают с разделенными именами. Вот как hideRefs
шаблоны в настоящее время обрабатываются в receive-pack.
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
: опционально разрешить выборку любого ша1
Кажется немного глупым проводить проверку достижимости в случае, когда мы доверяем пользователю получить доступ ко всему, что есть в репозитории.
Кроме того, это расплывчато в распределенной системе - возможно, один сервер рекламирует ссылку, но с тех пор другой сервер принудительно подтолкнул эту ссылку, и, возможно, два HTTP-запроса в конечном итоге направлены на эти разные серверы.