Примітка. Починаючи з git 1.9 / 2.0 (Q1 2014) , git fetch --tags
витягує теги на додаток до того, що отримується тим самим командним рядком без параметра.
Див зробити c5a84e9 по Michael Хаггерті (mhagger) :
Раніше --tags
варіант " " fetch вважався еквівалентним заданню refspec
refs/tags/*:refs/tags/*
у командному рядку; зокрема, це спричинило remote.<name>.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 (Q2 2015) git pull --tags
є більш надійним:
Див. Команду 19d122b від Paul Tan ( pyokagan
) , 13 травня 2015 р.
(Об’єднав Хуніо С Хамано - 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
перекривали б будь-які налаштовані рефлекси, і, таким чином, не було б злиття кандидатів. Таким чином, повідомлення про помилку було введено для запобігання плутанини.
Однак, оскільки c5a84e9 ( fetch --tags
: теги для отримання, крім
інших матеріалів, 2013-10-30, Git 1.9.0+), git fetch --tags
отримає теги на додаток до будь-яких налаштованих рефлексив.
Отже, якщо не виникає ситуація з кандидатами на об'єднання, це не тому, що --tags
було встановлено. Таким чином, це спеціальне повідомлення про помилку зараз не має значення.
Щоб уникнути плутанини, видаліть це повідомлення про помилку.
З Git 2.11+ (Q4 2016) git fetch
швидше.
Див. Запис 5827a03 (13 жовтня 2016 р.) Від Джеффа Кінга ( peff
) .
(Об’єднав Хуніо С Хамано - 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) , здається, ввів регрес , коли конфігурація 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
) .
(Об’єднано Хуніо С Хамано - gitster
- у комітеті 1d8b0df , 07 жовтня 2019 р.)
fetch
: використовувати, oidset
щоб утримати OID-адреси хотів для швидшого пошуку
Під git fetch
час клієнт перевіряє, чи є OID-адреси рекламованих тегів уже в наборі OID-запиту для отримання запиту.
Ця перевірка проводиться при лінійному скануванні.
Для сховища, в якому є багато записів, повтор цього сканування займає 15+ хвилин.
Щоб прискорити це, створіть oid_set
OID для інших посилань.