如果有一个存储库我只有git://访问权(通常只会推+拉),那么有没有一种方法可以像我在本地使用git branch -m那样重命名该存储库中的分支?
- 链接的"重复"问题要求将分支重命名为"本地和远程"。然而,这个问题只问如何远程重命名分支,这可以简化。这就是我在不需要签出和/或创建本地分支的情况下重命名服务器上的分支所做的:git push origin origin/old_name:refs/heads/new_name && git push origin :old_name。
- @你可以一次完成两个命令。这真的应该是这个问题的答案。
- @Joachimbreitner你是对的,我已经在我的脚本中做了优化。
- @你应该把你的评论作为回答,因为我比下面的其他人更喜欢它。
- 完成。
- 如何重命名本地Git分支的可能副本?
- 我尝试了以下所有方法。本质上,您不能重命名远程分支。以下所有方法都是删除旧的远程分支并创建新的远程分支。如果您在Gitlab中这样做,旧的分支机构/MR将关闭,您必须创建一个新的MR。
您只需创建一个具有所需名称的新本地分支,将其推送到远程,然后删除旧的远程分支:
1 2 3
| $ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name |
然后,要查看旧的分支名称,存储库的每个客户机都必须执行以下操作:
1 2
| $ git fetch origin
$ git remote prune origin |
注意:如果旧分支是主分支,则应更改主分支设置。否则,在运行$ git push origin :old-branch-name时,会出现错误"禁止删除当前分支"。
- 如果新名称和旧名称相同,这不会只是删除分支吗?如果你改变推的顺序,我想会安全一点。
- 好吧,如果新旧名称相同,则意味着您不需要重命名分支,因此首先运行命令是没有意义的;-)
- 当然。我的意思是,如果您以自动化的方式调用它(作为其他脚本的函数部分),那么最好不要让它做错误的事情,如果您可以避免它的话。
- 但是,自动化工具可以很容易地检查名称以避免这种情况。
- 丹的方法:重新排序命令,使它们总是工作。地球引擎的方式:总是记得检查,否则会丢失数据。我知道我会选哪一个。
- 按照同样的步骤。但我重新命名了当地的分支机构,然后推动它。谢谢你的主意!@西尔维恩德弗雷斯内
- 要使其成为别名以便运行"git mvbranch oldbranch newbranch",请将其放入~/.gitconfig[alias]块:mvbranch ="!moveit() { git branch -m $1 $2; git push origin :$1; git push --set-upstream origin $2; }; moveit"。
- 用户只需运行:git fetch origin --prune(以有效地获取新的分支,并消除不再在远程的引用)。
- 可以在较新版本的Git中使用-d或--delete,而不是:。
- @SylvainedFresne,如果您试图更改远程存储库的活动分支的远程分支的名称,该怎么办?如果您无法访问远程裸机回购(如通过Github),如何远程更改主分支设置?
如果您真的只想远程重命名分支,而不同时重命名任何本地分支,您可以使用一个命令执行此操作:
1
| git push <remote> <remote>/:refs/heads/<new_name> : |
我编写了这个脚本(git rename remote branch),它提供了一个方便的快捷方式来轻松完成上面的工作。
整合@ksrb的评论:这基本上是两个推一个命令,先是git push /:refs/heads/推一个基于旧的远程跟踪分支的新远程分支,然后git push :删除旧的远程分支。
- 对于那些想要这个命令的别名的人:rename="!f()git push origin/$1:refs/heads/$2:$1;f"这可以用作>git rename
- 3G有限的互联网友好型。必须选择为接受答案。
- 如果您已经将本地分支设置为使用其旧名称跟踪远程分支,那么这是唯一的工作解决方案。
- 对于那些好奇这个命令实际上意味着什么的人来说,它本质上是2个push git push /:refs/heads/意味着push一个新的remote,它使用旧的remote作为一个src,然后git push [space]:意味着删除旧的remote
- 为什么需要使用refs/heads/name?你不能直接使用name命令,第一个命令是git push /:吗?
- 不,因为远程分支还不存在。如果分支不存在,git要求您使用全名,否则也可以引用标记名。
- 我们在构建系统中使用这种方法。我们遇到的唯一警告是如果refs/heads/已经存在。删除仍然成功,导致/只被删除。手前检查可以很容易地避免这种情况。
- 它必须在refs中表示EDOCX1(复数)。
- @非常感谢!我要删除我原来的评论。所以我做了一个打字错误,用head代替heads,而git仍然说"创建了新的分支",实际上没有新的分支可以看到!
- 它们实际上是被创建的,只是不在bitback关心的名称空间中。
- 他们也没有出现在江户十一号〔0〕上。
- 它们不会出现在任何与分支相关的命令中,因为它们只查看heads名称空间,至少在默认情况下是这样。我不是说它是特定于BitBucket的,我只是想解释为什么BitBucket不关心它们,为什么这样做可以。
- @我修复了你的脚本链接,它被破坏了…有没有想过把这些贡献给git-extras或其他什么?看起来很有用!
- 谢谢,我已经批准了编辑。但我想这对git-extras来说还不够复杂。
- 为我必须表演的许多分支Renames工作得非常好!
首先签出到要重命名的分支:
1 2
| git branch -m old_branch new_branch
git push -u origin new_branch |
从remote中删除一个旧分支:
1
| git push origin :old_branch |
- 将重命名的分支(新分支)推到远程(源站)时,还应将其上游设置为使用新名称(如git push -u origin new_branch跟踪分支,否则重命名的分支(新分支)将继续跟踪源站/旧分支。一旦删除了远程的旧分支,新的分支仍然会跟踪源分支/旧分支,尽管现在分支已经不存在了。
- @海豚梦我编辑了答案,包括你有用的上游变化。
- 这是有效的。:)
当然。只需在本地重命名分支,推送新分支,并推送删除旧分支即可。
唯一真正的问题是,存储库的其他用户不会重命名本地跟踪分支。
- 因此,在尝试删除master时,我尝试了$git clone../src$cd src$git branch notmaster$git checkout notmaster$git branch-d master$git push../src:master,但它抱怨:目标refspec既不匹配远程上的现有引用,也不以refs/开头,并且我们无法根据源引用猜测前缀。错误:无法将某些引用推送到".../alpha/"。远程程序确实有一个名为master的分支
DR
"重命名"远程分支实际上是一个两步过程(不一定按顺序排列):
- 删除旧的远程分支(如ksrb所解释的git push [space]:)。
- 推入一个新的远程分支(下面几个应答命令之间的差异)。
删除
我使用tortoisegit,当我第一次尝试通过命令行删除分支时,我得到了:
Please make sure you have the correct access rights and the repository exists.
这可能是因为页面没有加载私钥(TortoisGit会自动加载到页面)。此外,我注意到tortoisegit命令中没有originref(例如git.exe push --progress"my_project" interesting_local:interesting)。
我也在使用BitBucket,作为其他基于Web的在线Git管理器(GitHub、GitLab),我可以直接通过它们的接口(分支页面)删除远程分支:
但是,在TortoisGit中,您还可以通过浏览引用删除远程分支:
右键单击远程分支(远程列表),将显示删除远程分支选项:
推
删除旧的远程分支后,我直接通过TortoisGit推送到一个新的远程分支,只需在推送窗口的remote:字段中键入新名称,该分支就自动创建并在bitback中可见。
但是,如果您仍然喜欢手动操作,那么这个线程中还没有提到的一点是-u=--set-upstream。
从git push文档来看,-u只是--set-upstream的别名,所以sylvain(-set-upstream new-branch和shashansk(-u origin new_branch的答案中的命令是等效的,因为如果以前没有定义其他引用,远程引用默认为origin:
- git push origin -u new_branch=git push -u new_branch。从文档描述:
If the configuration is missing, it defaults to origin.
最后,我没有手动输入或使用这里其他答案建议的任何命令,所以这可能对类似情况下的其他人有用。
- 问题是你的遥控器不是叫origin。您必须在运行命令git remote时命名您的遥控器。Git与ssh合作,这意味着您使用的是公钥+私钥。我假设TortoisGit的Autoload Putty keys只是自动加载所需的键,以便您使用远程引用执行任何操作。最后一件事是,git push -u不是推入远程分支的别名,它是推入本地创建的远程分支的别名,它的远程引用还没有这个分支。
- @juancab -u是--set-upstream的别名,"如果缺少配置,则默认为origin"。Sylvain和Shashank使用这个来推进一个新创建的远程分支。关键问题可能是因为我在shell上尝试git push origin :in时没有加载pagent。所以我不理解你的反对意见,我只是在其他答案中指出了我的和未解决的细节,解释了它们并解决了它们。
- 你说的是错误的事情,这个答案大部分与问题本身无关。如果你指出什么对你有用,我鼓励你把答案限制在它的作用上,如果你真的想给出解释,请告诉你自己更好。顺便说一句:-u是--set-upstream的别名,但正如您所说,它不是用于推入远程分支的别名。要推进到一个远程分支,您唯一需要的是git push ,如果它还不在远程分支中,则添加git push -u 。因此,-u用于创建远程分支的引用。
- @juancab也许你认为错误的主要是别名短语或单词的选择。我重新构造了我的答案,并对其进行了重新措辞,以便对我发现的重命名远程分支的解决方案提供完整的解释。
- 我会更进一步地重新措辞。现在说得更合理了,但还是太长了。我会更具体地说明这个问题,也就是说,对于TortoiseGit用户,建议的解决方案是行不通的。你在讲一个故事,这让人困惑,让用户避免阅读。我会用一个建议来编辑你的答案。
我不知道为什么,但是@sylvain defresne的回答对我不起作用。
1 2 3
| git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name |
我得把上游的水调平,然后再调一次。以下是我是如何做到的。
1 2 3 4
| git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name |
我不知道这是对还是错,但我把分支机构的"旧名称"推到分支机构的"新名称"上,然后用以下两行将旧分支机构完全删除:
1 2
| git push origin old_branch:new_branch
git push origin :old_branch |
- 我真希望有人告诉我为什么这是错的:(
- 据我所知,这正是所有其他答案所做的。你的回答更简洁。
可以基于旧名称分支创建新分支。就像这样,然后删除旧的分支,结束!!!!
添加到已经给出的答案中,这里有一个版本首先检查新分支是否已经存在(这样您就可以在脚本中安全地使用它)。
1 2 3 4 5 6 7 8
| 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。