Чи натискаються також теги git?


190

З часу створення мого сховища виявляється, що створені мною теги не висуваються до сховища. Коли я роблю git tagв локальній директорії, всі теги присутні, але коли я входжу у віддалений сховище та виконуючи git tag, з'являються лише перші кілька.

Що може бути проблемою ?.


3
git push --follow-tagsтепер може бути корисним, дивіться мою відповідь нижче
VonC


1
Погодьтеся з дублікатами: хоча це старіше, краще поставити інше питання.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Відповіді:


247

Ви можете це зробити:

git push --tags

27
Я майже впевнений, що це означає, що головні рефлекси не будуть штовхатись, це означає, що ви ТИЛЬКО натискаєте теги.
Дан Розенстарк

47
"Я рекомендую не використовувати чи навчати інших користуватися, git push --tagsоскільки це може бути дуже важко позбутися від поганих тегів, коли ваші колеги навчаються натискати всі теги, оскільки люди продовжують натискати старі погані теги, які вони мають локально, кожен раз, коли вони хочу наштовхнути новий тег. Через це я лише кожен радить комусь скористатися git push origin <tag_name>. " - скопійовано з stackoverflow.com/a/5195913/4130619
зменшення активності

Я думаю, що іншу відповідь, stackoverflow.com/a/16164809/11635, слід прийняти. Навіть якщо ні, то його неодмінно слід прочитати - це дає плюси і мінуси і, зрештою, більш практичну і правильну відповідь на сьогодні
Рубен Бартелінк,

140

У віддаленій конфігурації git за замовчуванням ви повинні чітко натискати теги (хоча вони автоматично вибираються разом із зобов’язаннями, на які вони вказують). Вам потрібно користуватися

$ git push <remote> tag <tagname>

щоб натиснути один тег, або

$ git push <remote> --tags

щоб натиснути всі теги (або git push --tags, як правило, для віддаленого за замовчуванням, зазвичай origin).

Це дуже задумана поведінка, щоб зробити чіткі теги явними. Натискання тегів має бути, як правило, усвідомленим вибором.


Узагальнення того, що написав Хуніо К. Хамано (посилання в коментарях від @Andre Miras)

Під час отримання даних ви взаємодієте з віддаленим сховищем, яке хтось опублікував, що означає:

  1. набір тегів, які існують, - всі видавці, яких хотіли бачити люди, і
  2. не тільки ви, але й інші люди також побачать ті самі теги.

Іншими словами, теги в сховищах, з яких ви отримуєте, призначені для загального доступу та загального користування. Це полегшить спілкування між розробниками, якщо всім легко отримати ті самі теги.

Ось чому git fetchавтоматично "слід" теги, тобто завантажує теги під час завантаження змін, на які вони вказують - іншими словами завантажує всі відповідні опубліковані теги.

Під час натискання ви натискаєте з вашого робочого сховища, яке більшість часу не є загальнодоступним, а теги в цьому сховищі не розроблені для загального доступу. Ви можете використовувати власні локальні теги для позначення свого прогресу, тому не має сенсу сліпо натискати всі теги у вашому сховищі до сховища, яке ви натискаєте, щоб публікувати свої зміни, теги яких за визначенням є загальнодоступними.

Ось чому вам потрібно чітко натиснути тег, щоб позначити тег як загальнодоступний.


Крім того, ви можете налаштувати пульт дистанційного керування, щоб завжди натискати всі теги, наприклад, поставити щось подібне у свій .git/config:

[віддалене "опублікування"] # або все, що воно названо
    URL = ...
    push = + refs / heads / *: refs / heads / *
    push = + refs / теги / *: refs / теги / *

Це означає примусово натискати всі голови (усі гілки) та всі теги (якщо ви не хочете примусового натискання голів, видаліть префікс '+' з refspec).


Чи не завжди це робить «силовим поштовхом» всіх голів?
Стефан Наве

@Stefan: Так, це так. Оновлено.
Якуб Нарубський

19
"Це дуже призначене поведінка, щоб зробити натискання тегів явними. Натискання тегів має бути, як правило, усвідомленим вибором." Я не розумію обґрунтування. Чи можете ви детальніше пояснити, чому було б погано для Git автоматично натискати теги?
Райан Лунді

13
@Kyralessa, у цій публікації git.661346.n2.nabble.com/… , Хуніо С Хамано (поточний супровід Git) пояснює, чому погано автоматичне натискання тегів.
Андре Мірас

@AndreMiras Дякую за цей дивовижний посилання. Було б добре, якби ми могли інтегрувати пост Джуніо в цю відповідь.
Гомер6

67

Зауважте, що з моменту git 1.8.3 (22 квітня 2013 р.) Вам більше не потрібно робити 2 команди, щоб натиснути гілки, а потім натиснути теги:

Нова --follow-tagsопція " " повідомляє " git push" натиснути відповідні помічені теги при натисканні гілок .

Тепер ви можете спробувати під час натискання нових комісій:

git push --follow-tags

Це не буде штовхати все локальні теги , хоча, тільки анотовані ті , на які посилається фіксацій , які штовхали з git push.


Це було введено в фіксації c2aba15 з допомогою Junio C Hamano ( gitster) :

Нова опція " --follow-tags" повідомляє " git push" проштовхувати помічені теги, які відсутні з іншого боку, і до яких може дійти історія, яка в іншому випадку виштовхується.

Наприклад, якщо ви користуєтесь натиском " simple", " current" або " upstream", ви зазвичай підштовхуєте історію, що веде до фіксації в поточний момент, HEADі більше нічого.
За допомогою цієї опції ви також пересунете всі помічені теги, до яких можна дістатись з цього комітету, на іншу сторону.


Конфігурація push.followTagsдозволяє включати --follow-tagsза замовчуванням (Git 2.4.1+, Q2 2015). Див. Розділ " Push git виконує посилання та теги одночасно "


3
Це лише висуває всі помічені теги. Більшість людей / проектів використовують легкі теги. Тож у більшості випадків git push --follow-tagsне підштовхують більшеgit push
Jarl

3
@Jarl так, у своїй відповіді я згадав "помічено". Але я дійсно використовував лише помічені теги, зберігаючи легкі теги для чисто внутрішнього використання (тобто ніколи не мав на увазі, щоб їх висувати).
VonC

@VonC: Тепер є також варіант конфігурації , що робить це за замовчуванням, як ви зазначили тут: stackoverflow.com/a/3745250/946850
krlmlr

19

Що я зазвичай роблю:

[віддалене "опублікування"] # або все, що воно названо
    URL = ...
    push =:
    push = + refs / теги / *: refs / теги / *

Це означає, що він висуває кожну гілку, яка вже є, плюс теги Це не змушує натискати, і не натискає на гілку, яку ви не натискали вручну.


Чи можу я також поставити це в глобальну конфігурацію git свого користувача? Якщо так, то як? Дякую! :)
gucki

Схоже, ви примушуєте теги, але не гілки.
Адріан Ратнапала

Ну, так, і ні, я написав це, це поштовхне нові теги, воно не змусить їх натискати, і воно не поштовхне гілками, які ви вже не натиснули самі.
мат

Я спробував пропозицію Якуба, але це штовхало гілки, які я хотів лише локально. Ця пропозиція, килимок, працює ідеально. Він синхронізує теги, але не синхронізує гілки, якщо вони не є гілками віддаленого відстеження (тобто не буде висувати нові гілки на віддалений, але оновить їх, якщо вони вже є у віддаленому). ПРИМІТКА. Якщо у вас є тег та гілка з однаковою назвою, ви отримуєте помилку "відповідає більше ніж одній". Зверніться до lostechies.com/jasonmeridth/2010/02/27/refspec-matches-more-than-one/ .
josephdpurcell

5

І якщо ви хочете змусити отримати всі теги, ви можете встановити його в конфігурації за допомогою:

git config remote.origin.tagopt --tags

З документів:

Якщо встановити це значення у --no-tags, вимикає автоматичний тег після підключення з віддаленого пристрою. Якщо встановити його на --tags, він отримує кожен тег з віддаленого, навіть якщо вони не доступні від віддалених голів філій. Передача цих прапорів безпосередньо git-fetch (1) може змінити цей параметр. Див. Параметри - теги та --no-теги git-fetch (1).


1
Питання було більш орієнтоване на натиск, чи застосовується ваша відповідь і при натисканні на пульт?
a1an
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.