Push git фиксирует и теги одновременно

388

Я знаю причину, которая git push --tagsявляется отдельной операцией к старой git push. Нажатие тегов должно быть осознанным выбором, так как вы не хотите случайно нажать один. Хорошо. Но есть ли способ объединить оба? (Кроме git push && git push --tags.)

Уилл Робертсон
источник
4
С чем у тебя проблема git push && git push --tags?
Fuz
21
Ничего особенного, просто медленнее, так как соединение должно быть установлено дважды.
Уилл Робертсон
16
Смотрите мой обновленный ответ ниже: --follow-tagsс git 1.8.3 появилась новая опция
VonC
24
Другая причина не делать это по отдельности, это избегать запуска двух сборок CI для одного и того же коммита, когда у вас есть такая автоматизация.
Алекс Р
также --tagsне различает легкие и аннотированные теги источника
karlsebal

Ответы:

556

Обновление май 2015

Начиная с git 2.4.1 , вы можете сделать

git config --global push.followTags true

Если установлено значение true, включите опцию --follow-tags по умолчанию.
Вы можете переопределить эту конфигурацию во время отправки, указав --no-follow-tags.

Как отметил в этой теме Мэтт Роджерс, отвечая Уэсу Херду :

--follow-tags только подталкивает аннотированные теги .

git tag -a -m "I'm an annotation" <tagname>

Это будет толкаться (в отличие от git tag <tagname>легкого тега, который не будет толкаться, как я уже упоминал здесь )

Обновление апрель 2013

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

Новая --follow-tagsопция " " сообщает " git push" выдвигать соответствующие аннотированные теги при выталкивании ветвей .

Теперь вы можете попробовать при нажатии новых коммитов:

git push --follow-tags

Это не будет выдвигать все локальные теги, только тот, на который ссылаются коммиты, которые передаются с помощью git push.

Git 2.4.1+ (второй квартал 2015 года) представит опцию push.followTags: см. « Как сделать так, чтобы git pushтеги включались в ветку? ».

Оригинальный ответ, сентябрь 2010

Ядерный вариант был бы git push --mirror, что подтолкнет все ссылки под refs/.

Вы также можете вставить только один тег с вашей текущей веткой коммита:

git push origin : v1.0.0 

Вы можете объединить --tagsопцию с refspec, например:

git push origin --tags :

(так как --tagsозначает: все ссылки под вставляютсяrefs/tags , в дополнение к ссылочным спецификациям, явно указанным в командной строке )


У вас также есть эта запись " Нажатие веток и тегов одним вызовом " git push "

Zoltán Füzesi только что опубликовал полезную подсказку в списке рассылки Git :

Я использую, .git/configчтобы решить это:

[remote "origin"]
    url = ...
    fetch = +refs/heads/*:refs/remotes/origin/*
    push = +refs/heads/*
    push = +refs/tags/*

После добавления этих строк git push originбудут загружены все ваши ветки и теги. Если вы хотите загрузить только некоторые из них, вы можете перечислить их.

Сам еще не пробовал, но похоже, что это может быть полезно, пока в git push не будет добавлен какой-то другой способ одновременного добавления веток и тегов.
С другой стороны, я не против печатать:

$ git push && git push --tags

Осторожно , так как заметил по Aseem Кишор

push = +refs/heads/*будет принудительно выталкивает все ваши филиалы .

Это укусило меня только сейчас, так что к вашему сведению.


Рене Шейбе добавляет этот интересный комментарий :

--follow-tagsПараметр вводит в заблуждение , так как только теги под .git/refs/tagsсчитаются.
Если git gcвыполняется, теги перемещаются из .git/refs/tagsв .git/packed-refs. После этого git push --follow-tags ...больше не работает, как ожидалось.

VonC
источник
3
Один комментарий к сообщению, на которое вы ссылаетесь правильно, указывает на то, что push = +refs/heads/*линия принудительно выталкивает все ваши ветви. Это укусило меня только сейчас, так что к вашему сведению
Асем Кишоре
2
Re: --follow-tagsфлаг, добавленный в git 1.8.3, могу ли я настроить мою установку git, чтобы сделать ее по умолчанию?
Тревор Бернхэм
1
@TrevorBurnham нет, только значение push.default( git-scm.com/docs/git-config ) можно определить действия по умолчанию на толчке ( nothing, matching, upstream, simpleкак и в stackoverflow.com/a/10002469/6309 ). Вам нужно добавить --follow-tagявно.
VonC
1
@VonC Что делать, если я хочу принудительно нажать тег? git push --follow-tags -fне работал для меня
Маурят
1
--follow-tagsПараметр вводит в заблуждение , так как только теги под .git/refs/tagsсчитаются. Если git gcвыполняется, теги перемещаются из .git/refs/tagsв .git/packed-refs. После этого git push --follow-tags ...больше не работает, как ожидалось.
Рене Шейбе
4

Может быть, это кому-то поможет

 1. git commit -a -m "msg"  
 2. git tag 0.1.0                // creates a new tag locally     
 3. git push origin tag 0.1.0    // pushes the tag & the code in the remote repo          
Раджеш Гупта
источник
Я попробовал ваше решение с помощью git-2.21.0.windows.1 и обнаружил, что тег 3 only
Dustin Sun
Это хорошо работает на моем конце. Вы пытаетесь все 3 команды в порядке, и удаленное репо установлено (git remote -v)?
Раджеш Гупта
Я использовал "git commit -m" msg "на шаге 1, а параметр -a отсутствовал.
Дастин Сан
2

@ Since Git 2.4

git push --atomic origin <branch name> <tag>

SoBeRich
источник
0

Git GUI

В Git GUI есть кнопка PUSH - простите за каламбур, а в открывшемся диалоговом окне есть флажок для тегов.

Я выдвинул ветку из командной строки без тегов, а затем снова попытался протолкнуть ветку, используя --follow-tagsопцию, описанную выше. Опция описана как следующие аннотированные теги. Мои теги были простыми тегами.

Я что-то исправил, пометил коммит с исправлением (чтобы коллеги могли выбрать исправление), затем изменил номер версии программного обеспечения и пометил созданный мной выпуск (чтобы коллеги могли клонировать этот выпуск).

Гит вернулся, сказав, что все было актуально. Он не отправил теги! Возможно, потому что теги не были аннотированы. Возможно, потому что не было ничего нового на ветке.

Когда я сделал похожий толчок с Git GUI, теги были отправлены.

Теги отправлены с Git GUI

В настоящее время я собираюсь отправить свои изменения на мои пульты с помощью Git GUI, а не с помощью командной строки и --follow-tags.

Иван
источник