Есть ли простая команда для преобразования ветки в тег?

19

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

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

Есть ли такая простая команда для преобразования ветки в тег?

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

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

#!/bin/sh

BRANCHNAME=
TAGNAME=

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
    
задан WinWin 12.07.2011 в 17:10
источник
  • Здесь я описал эффективный метод преобразования ветвей тегов SVN в теги git –  Onlyjob 27.12.2013 в 21:53
  • «Есть простая команда ...» - почти ничего в Git просто или соответствует основным рабочим процессам, так что легко ответить легко: НЕТ. То, что следует за простым, не имеет значения :) –  jww 08.09.2016 в 00:11

3 ответа

11

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

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

Это также можно сделать, если в отрасли была разработка, но вам нужно будет использовать -D вместо -d . Я не git pro, хотя, не уверен, что это «приемлемый» способ оставить ветку.

    
ответ дан Andy 12.07.2011 в 17:35
источник
  • Спасибо. Нет, никаких разработок в этих отраслях не было. На git checkout <branchName> и -d на последнем шаге меня испугало, но теперь я понимаю, что другого пути нет. Поэтому мне придется поэкспериментировать с этим на безопасной копии всего git (локального) репозитория. –  WinWin 12.07.2011 в 18:16
  • Если в этой ветке не было никакой разработки, тег будет иметь каждый бит так же хорошо, как ветвь (в конце они оба просто указывают на фиксацию). Использование маленького d гарантирует, что вы можете безопасно удалить ветку и не потерять работу. –  Andy 12.07.2011 в 18:27
  • Я только что закончил проверку того, что ваш 4-ступенчатый процесс работает для меня. См. Сценарий оболочки, который я написал, что отражает это. Еще раз спасибо, и ответ принят. –  WinWin 12.07.2011 в 22:16
  • Не лучше ли использовать аннотированные теги? git tag -a tagName –  Quantum7 23.04.2013 в 01:46
  • @ Quantum7 Я не думаю, что один лучше другого. У каждого из них своя цель. –  Andy 24.04.2013 в 23:39
Показать остальные комментарии
21

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

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

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>
    
ответ дан kauppi 06.05.2013 в 19:58
источник
  • О, мужчина. это просто. Наверное, я немного переработал свой ответ :) –  VitalyB 07.05.2013 в 07:35
2

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

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

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

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

git branch2tag bug-2483 master

ОБНОВЛЕНИЕ 1

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

    
ответ дан VitalyB 06.05.2013 в 19:42
источник