如果有一个我只能git://
访问的存储库(通常只是push + pull),是否有一种方法可以像我在本地使用的一样重命名该存储库中的分支git branch -m
?
如果有一个我只能git://
访问的存储库(通常只是push + pull),是否有一种方法可以像我在本地使用的一样重命名该存储库中的分支git branch -m
?
Answers:
您只需使用所需名称创建一个新的本地分支,将其推送到您的远程服务器,然后删除旧的远程分支机构:
$ 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 fetch origin --prune
以有效地获取新分支,并摆脱不再在远程上的引用)。
-d
或--delete
代替:
。
如果您确实只想远程重命名分支,而不必同时重命名任何本地分支,则可以使用一个命令执行此操作:
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 : $(basename $0) <remote> <old name> <new name>"
echo "Example : $(basename $0) origin master release"
exit 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 <remote>/<old_name>:refs/heads/<new_name>
意味着推送一个将旧遥控器用作src的新遥控器,然后 git push [space]:<old_name>
意味着删除旧遥控器
refs/heads/name
?您不能name
直接使用第一个命令git push <remote> <remote>/<old_name>:<new_name>
吗?
<new_name>
尚不存在。如果分支不存在,Git要求您使用全名,否则<new_name>
也可能引用标签名。
refs/heads/<new_name>
已经存在。删除仍然成功,导致<remote>/<old_name>
仅被删除。事前进行一些检查可以轻松避免这种情况。
首先签出要重命名的分支:
git branch -m old_branch new_branch
git push -u origin new_branch
要从中删除旧分支remote
:
git push origin :old_branch
git push -u origin new_branch
)跟踪分支,否则重命名的分支(new_branch)将继续跟踪origin / old_branch。并且,一旦删除了远程old_branch,尽管分支已经消失,new_branch仍将跟踪origin / old_branch。
当然。只需在本地重命名分支,推送新分支,然后删除旧分支即可。
唯一的实际问题是,存储库的其他用户不会重命名本地跟踪分支。
“重命名”远程分支实际上是一个两步过程(不一定有序):
git push [space]:<old_name>
如ksrb所述);我使用TortoiseGit,当我第一次尝试通过命令行删除分支时,我得到了:
$ git push origin :in
致命的:'origin'似乎不是git存储库
致命:无法从远程存储库读取。
请确保您具有正确的访问权限,并且存储库存在。
这很可能是由于寻呼机没有加载私钥(TortoiseGit自动将其加载到Pageant中)。此外,我注意到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
)的答案中的命令是等效的,因为如果以前没有定义其他引用,则远程引用默认为origin
:
git push origin -u new_branch
= git push -u new_branch
来自文档说明:
如果缺少配置,则默认为
origin
。
最后,我没有手动键入或使用此处其他答案所建议的任何命令,因此也许这对于类似情况的其他人可能很有用。
origin
。通过运行命令获取远程名称时,必须对其进行命名git remote
。Git的工作原理ssh
意味着您使用的是公钥和私钥。我假设Autoload Putty keys
TortoiseGit只是自动加载所需的键,以便您使用远程引用进行任何操作。最后一件事是,git push -u
它不是用于推送到远程分支的别名,它是用于推送到在本地创建的远程分支的别名,并且其远程引用还没有此分支。
-u
是您的别名,--set-upstream
但不是推送到远程分支的别名。要推送到远程分支,您非常需要git push <remote>
,如果还不在远程分支,则添加git push -u <remote>
。因此,-u
用于在远程中创建分支的引用。
我不知道为什么,但是@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
除了已经给出的答案之外,这是一个版本,该版本首先检查新分支是否已存在(因此您可以在脚本中安全地使用它)
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"
(检查来自此答案)
git show-ref --quiet --verify -- refs/heads/$new_name
代替ls-remote | cut | sed | grep
。
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
。