如果有一个存储库,我只有git://访问(通常只是推+拉),是否有一种方法重命名该存储库中的分支,以同样的方式,我将在本地用git branch -m?
当前回答
博士TL;
“重命名”一个远程分支实际上是一个2步的过程(不一定是有序的):
删除旧的远程分支(git push [space]:<old_name> as KSRB explained); 推入一个新的远程分支(下面两个回答命令之间的区别)。
删除
我使用TortoiseGit,当我第一次尝试通过命令行删除分支时,我得到了这个:
$ git push origin:in 致命:'origin'似乎不是git存储库 无法从远程存储库读取。 请确保您拥有正确的访问权限并且存储库存在。
这可能是由于pageant没有加载私钥(TortoiseGit自动将私钥加载到pageant中)。此外,我注意到TortoiseGit命令中没有origin ref(例如git.exe push——progress "my_project" interesting_local:interesting)。
我也在使用Bitbucket和其他基于web的在线git管理器(GitHub, GitLab),我能够直接通过他们的界面(分支页面)删除远程分支:
然而,在TortoiseGit中,你也可以通过浏览引用来删除远程分支:
右键单击一个远程分支(remotes列表),删除远程分支选项显示:
推
在删除旧的远程分支后,我通过TortoiseGit直接推到一个新的远程分支,只需在推送窗口的remote:字段中输入新名称,这个分支就会自动创建并在Bitbucket中可见。
然而,如果你仍然喜欢手动操作,在这个线程中还没有提到的一点是-u =——set-upstream。
在git推送文档中,-u只是——set-upstream的别名,所以Sylvain (-set-upstream new-branch)和Shashank (-u origin new_branch)回答中的命令是等价的,因为如果之前没有定义其他ref,远程ref默认为origin:
Git push origin -u new_branch = Git push -u new_branch 文档描述如下: 如果缺少配置,则默认为origin。
最后,我没有手动输入或使用这里其他答案所建议的任何命令,所以这可能对处于类似情况的其他人有用。
其他回答
如果你真的只想远程重命名分支,而不同时重命名任何本地分支,你可以用一个命令来完成:
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>删除旧的远程分支。
我不知道为什么,但@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"
(检查来自这个答案)
博士TL;
“重命名”一个远程分支实际上是一个2步的过程(不一定是有序的):
删除旧的远程分支(git push [space]:<old_name> as KSRB explained); 推入一个新的远程分支(下面两个回答命令之间的区别)。
删除
我使用TortoiseGit,当我第一次尝试通过命令行删除分支时,我得到了这个:
$ git push origin:in 致命:'origin'似乎不是git存储库 无法从远程存储库读取。 请确保您拥有正确的访问权限并且存储库存在。
这可能是由于pageant没有加载私钥(TortoiseGit自动将私钥加载到pageant中)。此外,我注意到TortoiseGit命令中没有origin ref(例如git.exe push——progress "my_project" interesting_local:interesting)。
我也在使用Bitbucket和其他基于web的在线git管理器(GitHub, GitLab),我能够直接通过他们的界面(分支页面)删除远程分支:
然而,在TortoiseGit中,你也可以通过浏览引用来删除远程分支:
右键单击一个远程分支(remotes列表),删除远程分支选项显示:
推
在删除旧的远程分支后,我通过TortoiseGit直接推到一个新的远程分支,只需在推送窗口的remote:字段中输入新名称,这个分支就会自动创建并在Bitbucket中可见。
然而,如果你仍然喜欢手动操作,在这个线程中还没有提到的一点是-u =——set-upstream。
在git推送文档中,-u只是——set-upstream的别名,所以Sylvain (-set-upstream new-branch)和Shashank (-u origin new_branch)回答中的命令是等价的,因为如果之前没有定义其他ref,远程ref默认为origin:
Git push origin -u new_branch = Git push -u new_branch 文档描述如下: 如果缺少配置,则默认为origin。
最后,我没有手动输入或使用这里其他答案所建议的任何命令,所以这可能对处于类似情况的其他人有用。
按照以下步骤更改分支名称:
Git branch -m old_branchname new_branchname Git推送源:old_branchname new_branchname Git push——set-upstream origin new_branchname
之后取回原点
Git获取来源 Git远程删除源文件
推荐文章
- 如何在Visual Studio中删除未推送的外向提交?
- Git在两个不同的文件之间的差异
- 我如何使用vimdiff来解决git合并冲突?
- 如何将更改提交到另一个预先存在的分支
- 为什么使用'git rm'来删除文件而不是'rm'?
- 我如何安装imagemagick与自制?
- 致命:git-write-tree:错误构建树
- Git克隆远程存储库的特定版本
- git隐藏的意图用例是什么?
- 从远程Git存储库检索特定的提交
- 如何配置git bash命令行补全?
- 我如何迫使git拉覆盖每一个拉上的一切?
- 撤销“git add <dir>”?
- 是否可以在不先签出整个存储库的情况下进行稀疏签出?
- 如何移除SSH密钥?