Как вы вставляете тег 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
bstpierre
источник
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
neoneye
источник
4
это подтолкнуть все ваши теги
Давид Дрозд
2
Обратите внимание, что это на самом деле не решит проблему оригинального постера о перезаписи ветви тегом, а просто подтолкнет ваши теги к удаленному, не затрагивая ветви.
10

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

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

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

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