如果有一个我只有 git:// 访问权限的存储库(并且通常只是推拉),有没有办法重命名该存储库中的分支,就像我在本地使用 git branch -m 一样?
git://
git branch -m
您只需要创建一个具有所需名称的新本地分支,将其推送到远程,然后删除旧的远程分支:
$ 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 时,您将收到错误"deletion of the current branch prohibited" .
$ git push origin :old-branch-name
如果您真的只想远程重命名分支, without renaming any local branches at the same time ,您可以使用一个命令执行此操作:
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
我写了这个脚本(git-rename-remote-branch),它提供了一个方便的快捷方式来轻松完成上述操作 .
要集成@ ksrb的注释:这基本上是两个推送单个命令,首先 git push <remote> <remote>/<old_name>:refs/heads/<new_name> 推送基于旧远程跟踪分支的新远程分支,然后 git push <remote> :<old_name> 删除旧的远程分支 .
git push <remote> <remote>/<old_name>:refs/heads/<new_name>
git push <remote> :<old_name>
首先结帐到要重命名的分支:
git branch -m old_branch new_branch git push -u origin new_branch
要从 remote 删除旧分支:
remote
git push origin :old_branch
当然 . 只需在本地重命名分支,推送新分支,然后删除旧分支 .
唯一真正的问题是存储库的其他用户不会重命名本地跟踪分支 .
“重命名”远程分支实际上是一个两步过程(不一定是有序的):
删除旧的远程分支( git push [space]:<old_name> 为ksrb explained);
git push [space]:<old_name>
推入新的远程分支(下面几个答案命令之间的差异) .
我使用TortoiseGit,当我第一次尝试通过命令行删除分支时,我得到了这个:
$ git push origin:in致命:'origin'似乎不是一个致命的git存储库:无法从远程存储库中读取 . 请确保您具有正确的访问权限并且存储库存在 .
这可能是由于选美没有加载 private key (TortoiseGit自动加载到选美中) . 此外,我注意到TortoiseGit命令中没有 origin ref(例如 git.exe push --progress "my_project" interesting_local:interesting ) .
origin
git.exe push --progress "my_project" interesting_local:interesting
我也使用Bitbucket,和其他基于Web的在线git管理器(GitHub,GitLab)一样,我能够通过他们的界面(分支页面)直接删除远程分支:
但是,在TortoiseGit中,您还可以通过浏览参考删除远程分支:
通过右键单击远程分支(远程列表),将显示“删除远程分支”选项:
删除旧的远程分支后,我只需在Push窗口的Remote:字段中键入新名称,直接通过TortoiseGit推送到新的远程分支,这个分支在Bitbucket中自动创建并可见 .
但是,如果您仍然希望手动执行此操作,则此线程中尚未提及的一点是 -u = --set-upstream .
-u
--set-upstream
从git push docs开始, -u 只是 --set-upstream 的别名,因此Sylvain (-set-upstream new-branch)和Shashank (-u origin new_branch)的答案中的命令是等效的,因为远程ref defaults to origin 如果之前没有定义其他ref:
来自docs description的
git push origin -u new_branch
git push -u new_branch
如果缺少配置,则默认为origin .
最后,我没有手动键入或使用此处其他答案建议的任何命令,因此这可能对类似情况下的其他人有用 .
我不知道为什么,但@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
我不知道这是对还是错,但我把分支的“旧名称”推到分支的“新名称”,然后用以下两行完全删除了旧分支:
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"
(支票来自this answer)
9 回答
您只需要创建一个具有所需名称的新本地分支,将其推送到远程,然后删除旧的远程分支:
然后,要查看旧分支名称,存储库的每个客户端都必须执行以下操作:
注意:如果旧分支是主分支,则应更改主分支设置 . 否则,当您运行
$ git push origin :old-branch-name
时,您将收到错误"deletion of the current branch prohibited" .如果您真的只想远程重命名分支, without renaming any local branches at the same time ,您可以使用一个命令执行此操作:
我写了这个脚本(git-rename-remote-branch),它提供了一个方便的快捷方式来轻松完成上述操作 .
要集成@ ksrb的注释:这基本上是两个推送单个命令,首先
git push <remote> <remote>/<old_name>:refs/heads/<new_name>
推送基于旧远程跟踪分支的新远程分支,然后git push <remote> :<old_name>
删除旧的远程分支 .首先结帐到要重命名的分支:
要从
remote
删除旧分支:当然 . 只需在本地重命名分支,推送新分支,然后删除旧分支 .
唯一真正的问题是存储库的其他用户不会重命名本地跟踪分支 .
TL; DR
“重命名”远程分支实际上是一个两步过程(不一定是有序的):
删除旧的远程分支(
git push [space]:<old_name>
为ksrb explained);推入新的远程分支(下面几个答案命令之间的差异) .
正在删除
我使用TortoiseGit,当我第一次尝试通过命令行删除分支时,我得到了这个:
这可能是由于选美没有加载 private key (TortoiseGit自动加载到选美中) . 此外,我注意到TortoiseGit命令中没有
origin
ref(例如git.exe push --progress "my_project" interesting_local:interesting
) .我也使用Bitbucket,和其他基于Web的在线git管理器(GitHub,GitLab)一样,我能够通过他们的界面(分支页面)直接删除远程分支:
但是,在TortoiseGit中,您还可以通过浏览参考删除远程分支:
通过右键单击远程分支(远程列表),将显示“删除远程分支”选项:
推
删除旧的远程分支后,我只需在Push窗口的Remote:字段中键入新名称,直接通过TortoiseGit推送到新的远程分支,这个分支在Bitbucket中自动创建并可见 .
但是,如果您仍然希望手动执行此操作,则此线程中尚未提及的一点是
-u
=--set-upstream
.从git push docs开始,
-u
只是--set-upstream
的别名,因此Sylvain (-set-upstream new-branch)和Shashank (-u origin new_branch)的答案中的命令是等效的,因为远程ref defaults to origin 如果之前没有定义其他ref:来自docs description的
git push origin -u new_branch
=git push -u new_branch
:最后,我没有手动键入或使用此处其他答案建议的任何命令,因此这可能对类似情况下的其他人有用 .
我不知道为什么,但@Sylvain Defresne的回答对我不起作用 .
我必须取消设置上游,然后我可以再次设置流 . 以下是我的做法 .
我不知道这是对还是错,但我把分支的“旧名称”推到分支的“新名称”,然后用以下两行完全删除了旧分支:
您可以基于旧名称分支创建新分支 . 就像这样,然后删除旧的分支,结束!
添加到已经给出的答案,这里是一个版本,首先检查新分支是否已经存在(所以你可以安全地在脚本中使用它)
(支票来自this answer)