是否有一个简单的命令将分支转换为标签?

时间:2011-07-12 15:10:51

标签: git git-branch git-tag

我即将完成将“哑快照”转换为git的繁琐过程。这个过程一直很顺利(感谢this rename process),但现在我意识到我创建的一些分支不值得branch而是tag

由于一切仍然是本地的(从未被推送到存储库),我发现this question(以及相关的答案)比我更喜欢有点麻烦,所以我想知道我是否可以通过一些简单的“转换”来获取快捷方式-from-branch-to-tag“命令?

是否有这么简单的命令将分支转换为标记?

(我知道我可以保留原样,但我非常喜欢gitk突出标记的方式,帮助我轻松识别它们。)

更新:感谢@ Andy在下面的回答,我设法提出了一个shell脚本,可以方便,轻松地完成所有操作。我正在为了所有人的利益而分享这个剧本,并特别感谢这个伟大的社区,他为我提供了CVS的可能性:

#!/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 个答案:

答案 0 :(得分:23)

给出的答案基本上是正确的。

由于标签和分支只是对象的名称,因此有一种更简单的方法,而不会触及当前的工作区域:

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>

答案 1 :(得分:12)

这些分支机构是否有单独的发展? (您链接到的帖子,似乎没有在这些分支上进行开发) 如果没有开发,你可以:

  1. 结帐分支git checkout branchName
  2. 使用git tag tagName标记。
  3. 切换回主人git checkout master
  4. 最后,使用git branch branchName -d删除原始分支。
  5. 如果分支上有开发,也可以这样做,但您需要使用-D而不是-d。我不是git pro,所以不确定这是否是“可接受的”离开分支的方式。

答案 2 :(得分:2)

Per Andy的回答,我已经制作了一个也可以用于同一件事的别名:

[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

更改为反映kauppi提出的解决方案。