Як ви натискаєте тег Git до гілки за допомогою refspec?


216

Я хочу примусити натиснути, наприклад, свій тег 1.0.0до моєї віддаленої masterгілки.

Зараз я роблю наступне:

git push production +1.0.0:master

Я хочу змусити натиснути , тому що все, що мені важливо, - це те, що код всередині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 і запускаю гіт-гілку -l, щоб перелічити гілки, я бачу лише свою іншу гілку. Однак, виробництво git push +1.0.0: master did push, а коли я повторно натискаю, він каже, що все актуально , але я не бачу головного відділення на віддаленому сервері.
Майкл van Rooijen

5
Вам слід змінити прийняту відповідь. Друга відповідь набагато простіша за ту, яка позначена як прийнята.
Педро Роло

Вибачте за пізню відповідь. Я згоден і тепер змінив прийняту відповідь.
Майкл van Rooijen

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-синтаксичному аналізі (1) у розділі " Визначення редакцій" .


1
Це вирішило проблему! Однак головна галузь вже повинна існувати. Але це не проблема з мого кінця. Велике спасибі за вашу допомогу!
Майкл van Rooijen

2
@Michael: Ага. Так, якщо master не існує (як гілка або тег), то git push rep +tag:masterстворимо тег з ім'ям master замість гілки. git push rep +tag~0:master(знову ж таки, коли майстер не існує як гілка чи тег) вийде з ладу "помилка: не вдається натиснути на некваліфіковане призначення". Команда, яка зробила б те, що ви хотіли (до того, як існувала будь-яка головна гілка / тег), є git push rep +tag~0:refs/heads/master( refs/heads/це простір імен, під яким зберігаються гілки).
Кріс Джонсен

ВЕЛИКИЙ! Це допоможе мені надзвичайно добре. Дуже зручно! Дуже дякую, що розмістили цю інформацію.
Майкл van Rooijen

4
@brad: ~{commit}синтаксис є буквальним (тобто завжди ці дев'ять символів); слово commitтут не є заповнювачем.
Кріс Джонсен

1
Ну гаразд! Вибачте, я думав, що ви хочете взяти участь у конкретних зобов'язаннях, має тепер більше сенсу.
брад

469
git push --tags production

4
Якщо тег уже існує на пульті дистанційного управління, спочатку потрібно видалити віддалений тег git push production :1.0.0.
шануйте Кодекс

1
Якщо з будь-якого приводу у вас буде філія з такою ж назвою: '1.0.0', цей поштовх не вдасться, тому краще використовувати: git push production :refs/tags/1.0.0видалити лише тег
Vladimir

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. Теги не пов'язані з гілками, вони зв'язані з комітами.

Коли ви хочете, щоб вміст тегу був у головній гілці, зробіть це локально на своїй машині. Я б припустив, що ви продовжували розвиватися у вашій місцевій магістерській галузі. Тоді просто git push origin masterповинно вистачити.


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