【问题标题】:Is there a simple command to convert a branch to a tag?是否有将分支转换为标签的简单命令?
【发布时间】:2011-10-03 17:38:22
【问题描述】:

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

由于一切仍然是本地的(从未推送到存储库),我发现this question(和相关的答案)比我喜欢的要麻烦一些,所以我想知道我是否可以通过一些简单的“convert-from”来走捷径-branch-to-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

【问题讨论】:

标签: git git-branch git-tag


【解决方案1】:

给出的答案基本正确。

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

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>

【讨论】:

  • 天哪。很简单。我想我的回答有点过度设计了:)
  • 哇...我从没想过这会这么容易!像魅力一样工作!
【解决方案2】:

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

  1. 查看分支git checkout branchName
  2. git tag tagName 标记它。
  3. 切换回mastergit checkout master
  4. 最后用git branch branchName -d删除原来的分支。

如果分支上有开发,也可以这样做,但您需要使用-D 而不是-d。不过我不是 git pro,所以不确定这是否是离开分支的 “可接受” 方式。

【讨论】:

  • 谢谢。不,这些分支没有任何发展。最后一步的git checkout &lt;branchName&gt;-d 吓到我了,但我现在明白没有别的办法了。因此,我将不得不在整个 git(本地)存储库的安全副本上对此进行试验。
  • 如果该分支上没有开发,则标记与分支一样好(最后它们都只是指向提交)。使用 little d 将确保您可以安全地删除分支并且不会丢失工作。
  • 我刚刚完成了对您的 4 步流程是否适合我的验证。请参阅我编写的反映这一点的 shell 脚本。再次感谢并立即接受回答。
  • 使用带注释的标签不是更好吗? git tag -a tagName
  • @Quantum7 我不认为一个比另一个更好。他们每个人都有自己的目的。
【解决方案3】:

根据安迪的回答,我制作了一个别名,也可以用于同一件事:

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

用法

如果你想将分支 bug-2483 转换为标签(而你的主分支是主分支),请写:

git branch2tag bug-2483 master

更新 1

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 2011-04-17
    • 2012-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多