Как вы вставляете тег Git в ветку, используя refspec?


216

Я хочу принудительно отправить, например, мой тег 1.0.0в мою удаленную masterветку.

Я сейчас делаю следующее:

git push production +1.0.0:master

Я хочу вызвать push , потому что все, что меня волнует, - это то, что код внутри1.0.0тега помещается вmasterветку удаленного репозитория.

Что я делаю не так?

Обновление № 1

Когда я захожу по SSH на свой сервер, где находится мой Git- репозиторий, и выполняю его git branch -l, я также не вижу masterветки в списке.

Обновление № 2

После запуска git tag -lиз удаленного репозитория Git, я вижу, что masterв списке, что означает, что, когда я запустил следующее:

git push production 1.0.0:master

Он фактически выдвинул тег и создал тег с именем, master а не новую ветвь .

Я хочу в основном поместить содержимое тега 1.0.0в masterветку удаленного репозитория Git.


Можете ли вы уточнить, что означает "не работает"? Git выдает конкретную ошибку или имеет нулевой эффект?
vcsjones

Мне жаль. Да, поэтому, в основном, когда я SSH на свой сервер, в git-репозиторий и запускаю git branch -l, чтобы вывести список ветвей, я вижу только другую мою ветку. Тем не менее, git push production +1.0.0: master сделал push, когда я повторяю push, он говорит, что все обновлено , но я не вижу ветку master на удаленном сервере.
Майкл ван Ройен

5
Вы должны изменить принятый ответ. Второй ответ намного проще, чем тот, который помечен как принятый.
Педро Роло

Извините за поздний ответ. Я согласен и теперь изменил принятый ответ.
Майкл ван Ройен

1
@MichaelvanRooijen Я не понимаю, как выбранный вами ответ на самом деле решает эту проблему. Он не перезаписывает ветку с тегом, он просто отправляет ваши теги на удаленный компьютер.

Ответы:


61

Вероятно, сбой, потому что 1.0.0это аннотированный тег. Возможно, вы увидели следующее сообщение об ошибке:

ошибка: попытка записать объект без фиксации в ветку refs /heads / master

У аннотированных тегов есть свой собственный особый тип объекта, который указывает на отмеченный объект фиксации. Ветви не могут с пользой указывать на объекты тегов, только коммитить объекты. Вам нужно «очистить» аннотированный тег, чтобы зафиксировать объект, и вместо этого нажать его.

git push production +1.0.0^{commit}:master
git push production +1.0.0~0:master          # shorthand

Существует другой синтаксис, который также будет работать в этом случае, но это означает что-то немного другое, если объект тега указывает на что-то другое, чем коммит (или объект тега, который указывает (объект тега, который указывает на…) коммит) ,

git push production +1.0.0^{}:master

Эти синтаксисы очистки тегов описаны в git-rev-parse (1) под заголовком Specifying Revisions .


1
Это решило проблему! Однако основная ветвь уже должна существовать. Это не проблема с моей стороны, однако. Большое спасибо за твою помощь!
Майкл ван Ройен

2
@ Майкл: Ааа. Да, если master не существует (как ветвь или тег), то вместо ветки git push rep +tag:masterбудет создан тег с именем master . git push rep +tag~0:master(опять же, когда мастер не существует как ветвь или тег) завершится с ошибкой «ошибка: невозможно отправить в неквалифицированное место назначения». Команда, которая сделала бы то, что вы хотели (до того, как существовал какой-либо основной ветвь / тег), git push rep +tag~0:refs/heads/master( refs/heads/это пространство имен, в котором хранятся ветки).
Крис Джонсен

ЗДОРОВО! Это поможет мне на удивление хорошо. Очень удобно! Большое спасибо за размещение этой информации.
Майкл ван Ройен

4
@brad: ~{commit}синтаксис буквальный (то есть всегда те девять символов); слово commitздесь не заполнено.
Крис Джонсен

1
Ах хорошо! извините, я думал, что вы хотели добавить конкретный коммит, теперь больше смысла.
Брэд

469
git push --tags production

4
Если тег уже существует на пульте дистанционного управления, сначала вам нужно удалить его git push production :1.0.0.
уважение TheCode

1
Если по какой-либо причине у вас будет ветвь с тем же именем: '1.0.0', этот пуш не удастся, так что лучше использовать: только git push production :refs/tags/1.0.0для удаления тега
Владимир,

1
@Nerian: я думаю, что это просто подталкивает теги
bstpierre

5
Как это на самом деле решает проблему оригинального плаката о переписывании ветки с тегом путем его принудительного нажатия? Это просто подталкивает все ваши теги к удаленному, не перезаписывает никакие ветви.

1
Не вопрос, спрашивающий, как нажать одну метку? Эта команда делает намного больше, чем это.
Крис Мартин

61

Я создаю тег, подобный этому, и затем помещаю его в GitHub:

git tag -a v1.1 -m "Version 1.1 is waiting for review"
git push --tags

Counting objects: 1, done.
Writing objects: 100% (1/1), 180 bytes, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:neoneye/triangle_draw.git
 * [new tag]         v1.1 -> v1.1

4
это подтолкнуть все ваши теги
Давид Дрозд

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

10

Для нажатия одного тега: git push <reponame> <tagname>

Так , например, git push production 1.0.0. Теги не привязаны к веткам, они привязаны к коммитам.

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


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