Как вы помещаете тег в удаленное хранилище с помощью Git?


2218

Я клонировал удаленный репозиторий Git на свой ноутбук, затем я хотел добавить тег, чтобы я запустил

git tag mytag master

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

Все современно

И если я захожу на рабочий стол и запускаю, git pullто git tagтеги не отображаются.

Я также попытался внести небольшие изменения в файл в проекте, а затем отправить его на сервер. После этого я мог перенести изменения с сервера на настольный компьютер, но при запуске git tagна настольном компьютере тега по-прежнему нет .

Как я могу вставить свой тег в удаленный репозиторий, чтобы его могли видеть все клиентские компьютеры?

Ответы:


1093

git push --follow-tags

Это нормальная опция, представленная в Git 1.8.3:

git push --follow-tags

Он выдвигает как коммиты, так и только теги, которые оба:

  • аннотированный
  • достижимый (предок) из выдвинутых коммитов

Это вменяемое, потому что:

  • вам следует только отправлять аннотированные теги на удаленное устройство и сохранять легкие теги для локальной разработки, чтобы избежать конфликтов тегов. Смотрите также: В чем разница между аннотированным и аннотированным тегом?
  • это не будет толкать аннотированные теги на несвязанных ветвях

Именно по тем причинам, которых --tagsследует избегать.

Git 2,4 добавил в push.followTagsопцию , чтобы включить этот флаг по умолчанию , которые можно установить с:

git config --global push.followTags true

16
Спасибо за это, имеет смысл выдвигать все за один раз, вместо того, чтобы выдвигать контент, а затем раздвигать теги отдельно.
Шейн

1
Для меня сразу не было ясно, что это было отношение «между аннотированным» и «достижимым из выдвинутых коммитов». Я надеялся, что это подтолкнет все достижимые теги, независимо от того, аннотированы они или нет. Может быть, изменить, чтобы убедиться, что это не ИЛИ?
Готье

soo, когда я сделал это, я возвращаюсь к bitbucket, должен ли я где-нибудь увидеть список тегов, кроме возможности видеть его из командной строки?
PositiveGuy

10
Это не работает для меня в git 2.5.0, но git push origin --tagsработает.
nnyby

3
Спасибо за совет push.followTags. Я не могу поверить, что это не стандартная установка по умолчанию. Без этого даже не надевайте теги, вы забудете и потеряете синхронизацию.
moodboom

3612

Чтобы вставить один тег:

git push origin <tag_name>

И следующая команда должна выдвинуть все теги ( не рекомендуется ):

git push --tags

427
Я рекомендую не использовать или не обучать других использовать, git push --tagsпоскольку избавиться от плохих тегов может быть очень и очень трудно, когда ваши коллеги обучены нажимать на все теги, поскольку люди продолжают нажимать старые плохие теги, которые они имеют локально, каждый раз, когда они хотят нажать новый тег. Из-за этого я буду только каждый советовать кому-то использовать git push origin <tag_name>сейчас.
Скотт Юнгвирт,

43
Чтобы переместить перемещенный тег: git push origin <tag_name> --force
Боб Стейн

38
Ну @ ScottJungwirth Я думаю, как разработчик, нужно быть осторожным. В противном случае вы могли бы также посоветовать вообще не обучать доступным командам.
Вилла

18
Если ваш тег совпадает с удаленной веткой и git pushне работает error: src refspec <tag_name> matches more than one., вы можете нажать его какgit push origin tag <tag_name>
Владимир Сапсай

5
Ну @Willa вопрос был «нажать на тег в удаленный репозиторий.» Так git push origin <tag_name>что гораздо лучший ответ на этот вопрос. ;)
Wildcard

265

Чтобы нажать конкретный, один тег сделать следующее git push origin tag_name


99

Чтобы расширить ответ Тревора , вы можете нажать один тег или все свои теги одновременно.

Нажмите одну метку

git push <remote> <tag>

Это краткое изложение соответствующей документации, которая объясняет это (некоторые параметры команды для краткости опущены):

git push [[<repository> [<refspec>…]]

<refspec>...

Формат <refspec>параметра ... источник ссылки <src>, за которым следует двоеточие :, а затем иое назначение <dst>...

<dst>Говорит , который исй на удаленной стороне обновляются с этим толчком ... Если :<dst>опущен, то же самая , как ссылка <src>будет обновляться ...

тег <tag>означает так же, как refs/tags/<tag>:refs/tags/<tag>.

Нажмите все ваши теги одновременно

git push --tags <remote>
# Or
git push <remote> --tags

Вот краткое изложение соответствующей документации (некоторые параметры команды для краткости опущены):

git push [--all | --mirror | --tags] [<repository> [<refspec>…]]

--tags

Все ссылки ниже refs/tagsвставляются, в дополнение к ссылочным спецификациям, явно указанным в командной строке.


Пример опускает ключевое слово tag. например git push origin tag funny-tag-1.
JamesThomasMoon1979

1
@ JamesThomasMoon1979 Тебе это не нужно. Вы выдвигаете один тег к источнику следующим образом: git push origin my-tag(Я только что попробовал!)
Andres F.

Я использовал версию 1.9.1 , а вы @AndresF. ?
JamesThomasMoon1979

1
@ JamesThomasMoon1979 Версия 2.10.2. Может это все?
Андрес Ф.

54

Теги не отправляются в удаленный репозиторий командой git push. Нам нужно явно отправить эти теги на удаленный сервер с помощью следующей команды:

git push origin <tagname>

Мы можем выдвинуть все теги одновременно, используя команду ниже:

git push origin --tags

Вот некоторые ресурсы для получения полной информации о тегах git:

http://www.cubearticle.com/articles/more/git/git-tag

http://wptheming.com/2011/04/add-remove-github-tags


51

Вы можете вставить все локальные теги просто git push --tagsкомандой.

$ git tag                         # see tag lists
$ git push origin <tag-name>      # push a single tag
$ git push --tags                 # push all local tags 


15

Я использую, git push <remote-name> tag <tag-name>чтобы убедиться, что я нажимаю тег. Я использую его как: git push origin tag v1.0.1. Этот шаблон основан на документации ( man git-push):

OPTIONS
   ...
   <refspec>...
       ...
       tag <tag> means the same as refs/tags/<tag>:refs/tags/<tag>.

1
отлично, должен был быть на вершине - так как он гарантирует, что тег, а не ветвь, выдвинут ошибкой.
Самсеры
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.