Примечание: начиная с git 1.9 / 2.0 (первый квартал 2014 года) , git fetch --tags
извлекает теги в дополнение к тем, которые выбираются той же командной строкой без опции.
См совершить c5a84e9 по Michael Хаггерти (mhagger) :
Ранее --tags
опция " " fetch считалась эквивалентной указанию refspec
refs/tags/*:refs/tags/*
в командной строке; в частности, это привело remote.<name>.refspec
к игнорированию конфигурации.
Но это не очень полезно для извлечения тегов без также извлечения других ссылок, в то время как он является весьма полезным , чтобы иметь возможность получать тег в дополнении к другим заданиям.
Поэтому измените семантику этой опции, чтобы сделать последнюю.
Если пользователь хочет получить только теги, то все еще можно указать явный refspec:
git fetch <remote> 'refs/tags/*:refs/tags/*'
Обратите внимание, что документация до 1.8.0.3 была неоднозначной об этом аспекте " fetch --tags
" поведения.
Коммит f0cb2f1 (2012-12-14) fetch --tags
сделал документацию соответствующей старому поведению.
Этот коммит изменяет документацию, чтобы соответствовать новому поведению (см. Documentation/fetch-options.txt
).
Запросите, чтобы все теги были извлечены с пульта в дополнение к тому, что еще выбирается .
Поскольку Git 2.5 (2-й квартал 2015 года) git pull --tags
является более надежным:
См. Коммит 19d122b от Paul Tan ( pyokagan
) , 13 мая 2015 г.
(объединено с Junio C Hamano gitster
- в коммите cc77b99 , 22 мая 2015 г.)
pull
: устранить --tags
ошибку в случае отсутствия кандидатов на слияние
Так как 441ed41 (" git pull --tags
": ошибка с лучшим сообщением., 2007-12-28, Git 1.5.4+), git pull --tags
напечатает другое сообщение об ошибке, если
git-fetch
не вернет никаких кандидатов на слияние:
It doesn't make sense to pull all tags; you probably meant:
git fetch --tags
Это связано с тем, что в это время git-fetch --tags
будут переопределены любые настроенные refspecs, и, следовательно, не будет кандидатов на слияние. Таким образом, сообщение об ошибке было введено для предотвращения путаницы.
Однако, поскольку c5a84e9 ( fetch --tags
: извлекать теги в дополнение к
другим материалам, 2013-10-30, Git 1.9.0+), git fetch --tags
будет извлекать теги в дополнение к любым настроенным refspecs.
Следовательно, если не возникает ситуация с кандидатами на слияние, это не потому, что --tags
была установлена. Таким образом, это специальное сообщение об ошибке теперь не имеет значения.
Чтобы избежать путаницы, удалите это сообщение об ошибке.
С Git 2.11+ (4 квартал 2016 г.) git fetch
быстрее.
См. Коммит 5827a03 (13 октября 2016 г.) Джеффа Кинга ( peff
) .
(Слиты Junio C Hamano - gitster
- в фиксации 9fcd144 , 26 окт 2016)
fetch
: используйте «быстрый» has_sha1_file
для отслеживания тегов
При выборке с пульта дистанционного управления, у которого есть много тегов, которые не имеют отношения к ветвям, за которыми мы следуем, мы использовали слишком много циклов, когда проверяли, существует ли объект, на который указывает тег (который мы не собираемся выбирать!), В нашем хранилище слишком осторожно
Этот патч учит fetch использовать HAS_SHA1_QUICK, чтобы жертвовать точностью ради скорости, в тех случаях, когда мы можем быть сумасшедшими с одновременной перепаковкой.
Вот результаты из включенного сценария perf, который устанавливает ситуацию, аналогичную описанной выше:
Test HEAD^ HEAD
----------------------------------------------------------
5550.4: fetch 11.21(10.42+0.78) 0.08(0.04+0.02) -99.3%
Это относится только к ситуации, когда:
- У вас есть много пакетов на стороне клиента, чтобы сделать их
reprepare_packed_git()
дорогими (самая дорогая часть - найти дубликаты в несортированном списке, который в настоящее время является квадратичным).
- Вам нужно большое количество ссылок на теги на стороне сервера, которые являются кандидатами для автоматического следования (то есть, что у клиента нет). Каждый из них запускает перечитывание каталога пакета.
- При нормальных обстоятельствах клиент будет автоматически следовать этим тегам, и после одной большой выборки (2) больше не будет истинным.
Но если эти теги указывают на историю, которая не связана с тем, что клиент извлекает иначе, он никогда не будет автоматически следовать, и эти кандидаты будут влиять на нее при каждой выборке.
Git 2.21 (февраль 2019), кажется, ввел регрессию, когда конфигурация неremote.origin.fetch
является конфигурацией по умолчанию ( '+refs/heads/*:refs/remotes/origin/*'
)
fatal: multiple updates for ref 'refs/tags/v1.0.0' not allowed
Git 2.24 (Q4 2019) добавляет еще одну оптимизацию.
См. Коммит b7e2d8b (15 сентября 2019 г.) от Masaya Suzuki ( draftcode
) .
(Слиты Junio C Hamano - gitster
- в фиксации 1d8b0df , 7 октября 2019)
fetch
: используйте, oidset
чтобы сохранить нужные OID для быстрого поиска
В течение git fetch
этого времени клиент проверяет, есть ли уже идентификаторы OID объявленных тегов в заданном OID запроса на выборку.
Эта проверка выполняется при линейном сканировании.
Для репозитория с большим количеством ссылок повторение этого сканирования занимает более 15 минут.
Чтобы ускорить это, создайте oid_set
OID для других ссылок.