在Git中远程重命名分支

如果有一个存储库,我只有git://访问权限(通常只是推+拉),是否有一种方法可以重命名该存储库中的分支,就像我在本地使用git branch -m一样?

323142 次浏览

当然。只需在本地重命名分支,推送新分支,并推送旧分支的删除。

唯一真正的问题是存储库的其他用户不会重命名本地跟踪分支。

你只需要用你想要的名字创建一个新的本地分支,把它推到你的远程,然后删除旧的远程分支:

$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name

然后,要查看旧的分支名称,存储库的每个客户端必须执行以下操作:

$ git fetch origin
$ git remote prune origin

注意:如果你的旧分支是你的主分支,你应该改变你的主分支设置。否则,当你运行$ git push origin :old-branch-name时,你会得到错误"禁止删除当前分支"

首先签出你想重命名的分支:

git branch -m old_branch new_branch
git push -u origin new_branch

remote中移除一个旧分支:

git push origin :old_branch

如果你真的只想远程重命名分支不需要同时重命名任何本地分支,你可以用一个命令来完成:

git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>

我写了这个脚本(git-rename-remote-branch),它提供了一个方便的快捷方式来轻松地做上面的事情。

作为bash函数:

git-rename-remote-branch() {
if [ $# -ne 3 ]; then
echo "Rationale : Rename a branch on the server without checking it out."
echo "Usage     : ${FUNCNAME[0]} <remote> <old name> <new name>"
echo "Example   : ${FUNCNAME[0]} origin master release"
return 1
fi


git push $1 $1/$2\:refs/heads/$3 :$2
}

集成@ksrb的注释:这基本上是在一个命令中进行两次推,第一次git push <remote> <remote>/<old_name>:refs/heads/<new_name>推一个基于旧的远程跟踪分支的新的远程分支,然后git push <remote> :<old_name>删除旧的远程分支。

我不知道这是对是错,但我把分支的“旧名称”推到了分支的“新名称”,然后用下面两行代码完全删除了旧分支:

git push origin old_branch:new_branch
git push origin :old_branch

除了已经给出的答案,下面是一个版本,它首先检查新分支是否已经存在(因此您可以安全地在脚本中使用它)

if git ls-remote --heads "$remote" \
| cut -f2 \
| sed 's:refs/heads/::' \
| grep -q ^"$newname"$; then
echo "Error: $newname already exists"
exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"

(支票来自这个答案)

博士TL;

“重命名”一个远程分支实际上是一个2步的过程(不一定是有序的):

  • 删除旧的远程分支(git push [space]:<old_name>作为ksrb解释);
  • 推入一个新的远程分支(下面两个回答命令之间的区别)。

删除

我使用TortoiseGit,当我第一次尝试通过命令行删除分支时,我得到了这个:

$ git push origin :in
  • 致命:'origin'似乎不是git存储库

  • 无法从远程存储库读取。

请确保您拥有正确的访问权限并且存储库存在。

这可能是由于选美比赛没有加载私钥 (TortoiseGit自动加载到选美比赛中)。此外,我注意到TortoiseGit命令中没有origin引用(例如git.exe push --progress "my_project" interesting_local:interesting)。

我也使用Bitbucket都和,作为其他基于web的在线git管理器的类型(GitHub, GitLab),我能够直接通过他们的界面(分支页面)删除远程分支:

Delete branch Bitbucket

然而,在TortoiseGit中,你也可以通过浏览参考资料删除远程分支:

Browse References menu

右键单击一个远程分支(remotes列表),删除远程分支选项就会出现:

TortoiseGit远程分支删除

删除旧的远程分支后,我通过TortoiseGit直接推入一个新的远程分支,只需在窗口的远程:字段中输入新名称,这个分支就自动创建并在Bitbucket都中可见。

然而,如果你仍然喜欢手动完成,在这个线程中还没有提到的一点是-u = --set-upstream

git push文档中,-u只是--set-upstream的别名,因此Sylvain (-set-upstream new-branch)沙(-u origin new_branch)答案中的命令是等效的,因为如果之前没有定义其他ref,则远程ref 默认为origin:

  • git push origin -u new_branch = git push -u new_branch文档描述:

    如果缺少配置,则默认为origin

    李< /引用> < / >

最后,我没有手动输入或使用这里其他答案所建议的任何命令,所以这可能对处于类似情况的其他人有用。

如果你使用Github……

你可以使用github.com上的UI创建一个基于旧名称分支的新分支:

分支重命名

我不知道为什么,但@Sylvain Defresne的答案对我来说不管用。

git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name

我必须取消上游的设置,然后我可以再次设置流。以下是我是如何做到的。

git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name

按照以下步骤更改分支名称:

  1. Git branch -m old_branchname new_branchname
  2. Git推送源:old_branchname new_branchname
  3. Git push——set-upstream origin new_branchname

之后取回原点

  1. Git获取来源
  2. Git远程删除源文件