Значит "ГИТ выборки --теги" включить "ГИТ выборки"?
хороший и простой вопрос - это функция "git fetch" строгий подмножество git fetch --tags?
т. е. если я сбегу git fetch --tags, есть ли когда-нибудь причина немедленно запустить git fetch сразу после этого?
а как же git pull и git pull --tags? Та же ситуация?
6 ответов:
Примечание: начиная с git 1.9 / 2.0 (Q1 2014),
git fetch --tagsизвлекает теги кроме что извлекается из той же командной строки без опции.посмотреть commit c5a84e9 by Майкл Хаггерти (mhagger):
ранее, проныре "
--tags" вариант считался эквивалентным указанию refspecrefs/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 (Q2 2015)
git pull --tagsболее надежен:посмотреть commit 19d122b by Поль Тан (
pyokagan), 13 мая 2015 года.
(слитый Junio C Hamano--gitster-- in 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это потому, что в это время
С c5a84e9 (git-fetch --tagsотменяет любые настроил refspecs, и таким образом не было бы никаких кандидатов слияния. Таким образом, сообщение об ошибке было введено во избежание путаницы.fetch --tags: принести теги кроме другие вещи, 2013-10-30, Git 1.9.0+),git fetch --tagsбудет получать теги в дополнение для любых настроенных refspecs.
Следовательно, если какая-либо ситуация слияния кандидатов не происходит, это не потому, что--tagsбыл установлен. Таким образом, это специальное сообщение об ошибке теперь не имеет значения.чтобы избежать путаницы, удалите это сообщение об ошибке.
С Git 2.11+ (Q4 2016)
git fetchбыстрее.посмотреть совершить 5827a03 (13 окт 2016) by Джефф Кинг (
peff).
(слитый Junio C Hamano--gitster-- in commit 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()дорого (самая дорогая часть-это поиск дубликатов в несортированном списке, который в настоящее время является квадратичным).- вам нужно большое количество тегов refs на стороне сервера, которые являются кандидатами для автоматического следования (т. е., что клиент не имеет). Каждый из них запускает повторное чтение каталога пакета.
- в нормальных условиях, клиент был бы автоматическое следование этим тегам и после одной большой выборки (2) больше не будет истинным.
Но если эти теги указывают на историю, которая отключена от того, что клиент в противном случае выбирает, то он никогда не будет автоматически следовать, и эти кандидаты будут влиять на каждую выборку.
Примечание: этот ответ действителен только для git v1.8 и старше.
большинство из этого уже было сказано в других ответах и комментариях, но вот краткое объяснение:
git fetchизвлекает все головки ветвей (или все указанные пультом дистанционного управления.fetch config option), все необходимые для них коммиты и все теги, которые доступны из этих ветвей. В большинстве случаев все теги доступны таким образом.git fetch --tagsизвлекает все теги, все совершает необходимые для них. Это будет не обновить головки ветвей, даже если они доступны из тегов, которые были выбраны.резюме: если вы действительно хотите быть полностью в курсе, используя только fetch, вы должны сделать и то, и другое.
это также не "в два раза медленнее", если вы не имеете в виду с точки зрения ввода в командной строке, и в этом случае псевдонимы решают вашу проблему. Там по существу нет накладных расходов в принятии двух запросов, так как они просят различная информация.
Я собираюсь ответить на это сам.
Я определил, что есть разница. "git fetch --tags" может принести все теги, но он не приносит никаких новых коммитов!
оказывается, это нужно сделать, чтобы быть полностью "в курсе", т. е. реплицировать "git pull" без слияния:
$ git fetch --tags $ git fetchЭто позор, потому что это в два раза медленнее. Если бы только "git fetch" имел возможность делать то, что он обычно делает и все метить.
общая проблема здесь заключается в том, что
git fetchполучать+refs/heads/*:refs/remotes/$remote/*. Если какой-либо из этих коммитов имеет теги, эти теги также будут извлечены. Однако если есть теги, недоступные какой-либо веткой на удаленном устройстве, они не будут извлечены.The
--tagsопция переключает refspec в+refs/tags/*:refs/tags/*. Ты может задатьgit fetchсхватить обоих. Я почти уверен, что просто сделатьgit fetch && git fetch -tвы бы использовали следующую команду:git fetch origin "+refs/heads/*:refs/remotes/origin/*" "+refs/tags/*:refs/tags/*"и если вы хотите сделать это по умолчанию для этого РЕПО, вы можете добавить второй refspec для выборки по умолчанию:
git config --local --add remote.origin.fetch "+refs/tags/*:refs/tags/*"это добавит второй
fetch =строка.git/configдля этого пульта дистанционного управления.
я потратил некоторое время на поиск способа справиться с этим для проекта. Вот что я придумал.
git fetch -fup origin "+refs/*:refs/*"в моем случае я хотел, чтобы эти функции
- возьмите все головы и теги с пульта дистанционного управления, так что используйте refspec
refs/*:refs/*- переписать локальные ветви и теги с non-fast-forward
+перед refspec- перезаписать текущую проверенную ветку, если это необходимо
-u- удалить ветви и теги, отсутствующие в remote
-p- и заставить быть уверенным
-f
в большинстве ситуаций,
git fetchдолжен делать то, что вы хотите, а именно: "получить что-нибудь новое из удаленного репозитория и поместить его в локальную копию без слияния с локальными филиалами".git fetch --tagsделает именно это, за исключением того, что он не получает ничего, кроме новых тегов.в этом смысле
git fetch --tagsникоим образом не является надмножествомgit fetch. На самом деле все с точностью до наоборот.
git pull, конечно, это не что иное, как обертка дляgit fetch <thisrefspec>; git merge. Рекомендуется привыкайте делать вручнуюgit fetchиgit mergeing, прежде чем сделать прыжок вgit pullпросто потому, что это поможет вам понять, чтоgit pullделает в первую очередь.это, как говорится, отношения точно такие же, как с
git fetch.git pull- это надмножествоgit pull --tags.
git fetch upstream --tagsработает просто отлично, он будет получать только новые теги и не будет получать никакой другой код базы.
Comments