Примечание: начиная с git 1.9 / 2.0 (1 квартал 2014 года) , git fetch --tags
выбирает теги в дополнение к , которые выбираются той же командной строкой без опции.
См. коммит c5a84e9 от Майкл Хаггерти (mhagger) :
Ранее параметр fetch "--tags
" считался эквивалентным указанию refspec
refs/tags/*:refs/tags/*
в командной строке;
в частности, это привело к игнорированию конфигурации remote.<name>.refspec
.
Но не очень полезно извлекать теги без извлечения других ссылок, в то время как является весьма полезным, чтобы иметь возможность извлекать теги в дополнение к другим ссылкам.
Поэтому измените семантику этой опции, чтобы сделать последнюю.
Если пользователь хочет получить только тегов, тогда все еще возможно указать явный refspec:
git fetch <remote> 'refs/tags/*:refs/tags/*'
Обратите внимание, что документация до 1.8.0.3 была неоднозначной в отношении этого аспекта поведения "fetch --tags
".
Commit f0cb2f1 (2012-12-14) fetch --tags
сделал документацию соответствующей старому поведению.
Этот коммит изменяет документацию, чтобы соответствовать новому поведению (см. Documentation/fetch-options.txt
).
Запросить, чтобы все теги были извлечены с пульта в дополнение ко всему, что выбирается .
Начиная с Git 2.5 (второй квартал 2015 года) git pull --tags
более устойчив:
См. коммит 19d122b от Пол Тан (pyokagan
) , 13 мая 2015 г.
(Объединено с Junio C Hamano - gitster
- в commit 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
для следования тега
При извлечении из пульта дистанционного управления, имеющего много тегов, которые не имеют отношения к ветвям, за которыми мы следуем, мы тратили слишком много циклов, проверяя, существует ли объект, на который указывает тег (который мы не собираемся выбирать!) в нашем хранилище слишком аккуратно.
Этот патч учит принуждению использовать 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), кажется, ввел регрессию, когда config remote.origin.fetch
равен , а не по умолчанию ('+refs/heads/*:refs/remotes/origin/*'
)
fatal: multiple updates for ref 'refs/tags/v1.0.0' not allowed