Ответ 1
Примечание: начиная с git 1.9/2.0 (1 квартал 2014 года), git fetch --tags
выбирает теги в дополнение к тому, что выбирается той же командной строкой без опции.
См. коммит c5a84e9 от Майкла Хаггерти (мхаггер):
Ранее выборка "
--tags
" считалась эквивалентной указанию refspecrefs/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 (второй квартал 2015 года) git pull --tags
стал более надежным:
См. коммит 19d122b от Пола Тана (pyokagan
), 13 мая 2015 года.
(Merged by Junio C Hamano -- [TG410] -- in commit cc77b99, 22 May 2015)
pull
: удалить ошибку--tags
в случае отсутствия кандидатов на слияниеПоскольку 441ed41 ("
git pull --tags
": ошибка с лучшим сообщением., 2007-12-28, Git 1.5. 4+),git pull --tags
выведет другое сообщение об ошибке, еслиgit-fetch
не вернул ни одного кандидата на слияние:It does not 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+ (Q4 2016) git fetch
быстрее.
См. коммит 5827a03 (13 октября 2016 г.) от Джеффа Кинга (peff
).
(Merged by Junio C Hamano -- [TG423] -- in commit 9fcd144, 26 Oct 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), кажется, ввел регрессию, когда конфигурация 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 г.) от Масая Сузуки (draftcode
).
(Merged by Junio C Hamano -- [TG432] -- in commit 1d8b0df, 07 Oct 2019)
fetch
: используйтеoidset
, чтобы сохранить нужные OID для быстрого поискаВо время
git fetch
клиент проверяет, есть ли уже идентификаторы OID объявленных тегов в запросе на выборку, чтобы установить OID.
Эта проверка выполняется при линейном сканировании.
Для репозитория, имеющего много ссылок, повторение этого сканирования занимает 15+ минут.Чтобы ускорить это, создайте
oid_set
для OID других рефери.