Есть ли простая команда для преобразования ветки в тег? - PullRequest
25 голосов
/ 12 июля 2011

Я собираюсь завершить утомительный процесс преобразования "немых снимков" в git. Этот процесс идет очень хорошо (благодаря этому процессу переименования ), но теперь я понял, что некоторые из созданных мною ветвей не заслуживают branch, а скорее tag.

Поскольку все по-прежнему локально (никогда не отправляется в репозиторий), я нашел этот вопрос (и связанный с ним ответ) несколько более громоздким, чем я предпочитаю, поэтому мне было интересно, могу ли я использовать ярлык через некоторые простая команда "преобразовать из ветви в тег"?

Существует ли такая простая команда для преобразования ветви в тег?

(я знаю, что могу просто оставить все как есть, но мне действительно нравится, как gitk выделяет метки, помогая мне легко их идентифицировать).

ОБНОВЛЕНИЕ: Благодаря ответу @ Энди ниже, мне удалось придумать сценарий оболочки, который делает все это удобно и безболезненно. Я делюсь этим сценарием на благо всех, и в частности, благодаря этому замечательному сообществу, которое сделало возможным переход на CVS для git:

#!/bin/sh

BRANCHNAME=$1
TAGNAME=$2

echo "Request to convert the branch ${BRANCHNAME} to a tag with the same name accepted."
echo "Processing..."
echo " "

git show-ref --verify --quiet refs/heads/${BRANCHNAME}
# $? == 0 means local branch with <branch-name> exists. 

if [ $? == 0 ]; then
   git checkout ${BRANCHNAME}
   git tag ${BRANCHNAME}
   git checkout master
   git branch ${BRANCHNAME} -d
   echo " "
   echo "Updated list branches, sorted chronologically: "
   echo "---------------------------------------------- "
   git log --no-walk --date-order --oneline --decorate $(git rev-list --branches --no-walk) | cut -d "(" -f 2 | cut -d ")" -f 1
else
   echo "Sorry. The branch ${BRANCHNAME} does NOT seem to exist. Exiting."
fi

Ответы [ 3 ]

25 голосов
/ 06 мая 2013

Ответы в основном правильные.

Поскольку теги и ветви - это просто имена объектов, существует более простой способ, не касаясь текущей рабочей области:

git tag <name_for_tag> refs/heads/<branch_name> # or just git tag <name_for_tag> <branch_name>
git branch -d <branch_name>

Или даже сделать этона удаленный сервер, не затрагивая локальный репозиторий вообще:

git push origin origin/<branch_name>:refs/tags/<tag_name>
git push origin :refs/heads/<branch_name>
15 голосов
/ 12 июля 2011

Были ли отдельные разработки по этим веткам? (пост, на который вы ссылались, похоже, не имеет развития в этих ветках) Если бы не было развития, вы могли бы:

  1. Оформить заказ в филиале git checkout branchName.
  2. Отметьте его git tag tagName.
  3. Переключиться обратно на мастер git checkout master.
  4. Наконец, удалите оригинальную ветку с помощью git branch branchName -d.

Это также можно сделать, если в ветке была разработка, но вам нужно будет использовать -D вместо -d. Хотя я не профессионал, поэтому не уверен, что это "приемлемый" способ покинуть ветку.

2 голосов
/ 06 мая 2013

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

[alias]
branch2tag = "!sh -c 'set -e;git tag $1 refs/heads/$1;git branch -D $1' -"

Использование

Если вы хотите преобразовать ветку bug-2483 в тег (если ваша основная ветка master), напишите:

git branch2tag bug-2483 master

ОБНОВЛЕНИЕ 1

Изменено, чтобы отразить решение, предложенное Кауппи.

...