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

33

我即将完成将“愚蠢的快照”转换为Git的繁琐过程。这个过程一直很顺利(感谢此重命名过程),但现在我意识到我创建的某些分支不应该是branch而应该是tag

由于一切都还是本地的(从未推送到存储库),我发现这个问题(及其答案)有点麻烦,所以我想知道是否可以通过一些简单的“从分支转换为标签”的命令来快捷地实现?

有没有这样一个简单的命令可以将分支转换为标签?

(我知道我可以让它保持原样,但我真的很喜欢gitk突出显示标签的方式,这有助于我轻松地识别它们。)

更新: 感谢@Andy下面的答案,我设法编写了一个 shell 脚本,所有事情都方便和轻松。我分享这个脚本是为了造福所有人,并特别感谢这个伟大的社区,他们让我从 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

这里我描述了一种有效的方法,将SVN标签分支转换为git标签。 (https://dev59.com/YE7Sa4cB1Zd3GeqP7_FN#20807602) - Onlyjob
1
“是否有一个简单的命令......” - Git 中几乎没有什么是简单的或符合基本工作流程,因此这个问题很容易回答:没有。无论后面跟着什么词都不重要 :) - jww
3个回答

46

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

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

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>

哦,这很简单。我想我在我的回答中有点过度工程化了 :) - VitalyB
哇...我从没想过这会这么容易!像魔法一样好用! - JohnnyDevNull

20

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

  1. 检出分支 git checkout branchName
  2. git tag tagName 给它打标签。
  3. 切换回主分支 git checkout master
  4. 最后,用 git branch branchName -d 删除原来的分支。

如果该分支有开发,也可以这样做,但需要使用 -D 而非 -d。我不是 Git 高手,所以不确定这是否是一种“可接受”的保留分支方式。


谢谢。不,这些分支上没有任何开发。git checkout <branchName>和最后一步的-d让我感到害怕,但现在我明白了这是唯一的方法。所以我将不得不在整个git(本地)存储库的安全副本上进行实验。 - WinWin
2
如果该分支没有开发,则标签与分支同样有效(最终它们都只是指向一个提交)。使用小写字母"d"可以确保您可以安全地删除该分支而不会丢失工作。 - Andy
我刚刚完成了验证你的四步流程对我有效。请查看我编写的反映这一点的shell脚本。再次感谢,答案现在已被接受。 - WinWin
使用带注释的标签不是更好吗?git tag -a 标签名 - Quantum7
不需要先检出分支(正如其他答案所示)。 - Zitrax
显示剩余2条评论

2
根据安迪的答案,我已经制作了一个别名,也可以用于同样的事情:
[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提出的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接