Git将分支从一个远程推到另一个?


133

我设置了以下遥控器:

$ git remote 
korg
rorg

和以下分支:

$ git branch -a
* (no branch)
  remotes/korg/gingerbread
  remotes/korg/gingerbread-release
  remotes/korg/honeycomb
  remotes/korg/honeycomb-mr1-release
  remotes/korg/master
  remotes/m/android-2.3.3_r1 -> refs/tags/android-2.3.3_r1a
  remotes/m/gingerbread -> korg/gingerbread

现在,我希望将所有远程分支都推korgrorg远程。我怎么做?

如果可以避免的话,最好不要先为每个分支创建局部分支。


我猜这个答案与这个答案相当:stackoverflow.com/questions/6922700/…
莱戈拉斯

Answers:


52

对一些临时存储库进行的快速测试表明,您可以构造一个可以执行此操作的refspec:

$ git push rorg origin/one:refs/heads/one
Counting objects: 5, done.
Writing objects: 100% (3/3), 240 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /tmp/rorg
 * [new branch]      origin/one -> one

所以origin / BRANCHNAME:refs / heads / BRANCHNAME

签入我的rorg遥控器:

pat@host /tmp/rorg (BARE:master)
$ git graph --all
* 5750bca (HEAD, master) c
| * 13fd55a (one) b
|/
* 822e0de a

5
为什么不git push rorg origin/one:one(没有refs/heads/)代替呢?
阿里

2
@exalted因为refs/heads/前缀你推远程分支是不需要checkouted成千万one
ДМИТРИЙМАЛИКОВ

@patthoyts我尝试了提到的命令,它说了所有最新信息,但是我在远程A中有10个分支,在远程B中有6个分支,所以请您告诉我如何移动遗漏的分支?
Keshav1234 '18

219

我找到了这个:

git push rorg 'refs/remotes/korg/*:refs/heads/*'

它把我所有的远程分支机构从korg推到了rorg(即使没有分支机构的本地副本)。请参见下面的输出:

Counting objects: 293, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (67/67), done.
Writing objects: 100% (176/176), 48.32 KiB, done.
Total 176 (delta 105), reused 168 (delta 97)
remote: Resolving deltas:  11% (12/105)
To <<MY_REPOSITORY_URL>>
 * [new branch]      korg/gingerbread-> gingerbread
 * [new branch]      korg/gingerbread-release -> gingerbread-release
 * [new branch]      korg/honeycomb-> honeycomb
 * [new branch]      korg/HEAD -> HEAD
 * [new branch]      korg/honeycomb-mr1-release-> honeycomb-mr1-release
 * [new branch]      korg/master -> master

然后您可以对tags参考进行相同的推送:

git push rorg 'refs/tags/*:refs/tags/*'

2
在足够新的git(什么版本?)中,这应该是可接受的答案。如果您同意未来搜索者的利益,您是否想更改@ bjarke-freund-hansen的答案?
乔纳·格雷厄姆

1
我知道,“在足够新的git(什么版本?)中,这应该是可接受的答案”,这应该适用于每个公共git版本,因为那些推送签名和引用通配符是常见的
radistao 2015年

3
给我Everything up-to-date上的git 2.10.0什么也没有发生,同时做好对个别分行的工作原理相同。
user239558 '17

6
只是想我应该把它喊出来:这个方法似乎在名为的远程上创建了一个实际分支HEAD。但这可以删除。 git push rorg :HEAD
Mark Stickley

1
任何不熟悉refs结构并想知道如何推送标签的人都需要此命令: git push rorg refs/tags/*:refs/tags/*。这与相同git push rorg --tags,但最好了解这些操作的内容:)
Mark Stickley

14

为了补充patthoyt的回答,这是一个简短的shell脚本,该脚本将所有分支从一个远程推送到另一个远程:

SRC_REMOTE=korg
DST_REMOTE=rorg
for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->')
  do git push "$DST_REMOTE" "$a:refs/heads/${a//$SRC_REMOTE\/}"
done

总而言之,对于源远程服务器上的每个远程分支(不包括“指针”分支,如HEAD),请将其引用推送到目标远程服务器。(该${a//$SRC_REMOTE\/}位从分支名称中剥离源远程名称,即origin/master成为master。)


3
对于我们这些需要一键完成的人:git push -u $DST_REMOTE $(for a in $(git branch --list --remote "$SRC_REMOTE/*" | grep -v --regexp='->'); do echo "$a:refs/heads/${a//$SRC_REMOTE\/}"; done)
Jayen 2013年


0

对于我建议您运行的任何脚本,隐藏或提交所有更改都是明智的。

我需要将多个分支从一个远程服务器推到另一个远程服务器。这些答案要求本地分支机构以前存在

SRC_R=origin1
DEST_R=origin2
for cbranch in $(git branch -r | grep $SRC_R | cut -d '/' -f2,3,4,5 | cut -d ' ' -f1)
do
    git checkout $cbranch
    git push $DEST_R $cbranch
done

只需将origin1更改为源远程,并将origin2更改为目标远程。将其复制到“ remoteBranchCloner.sh”,然后使用“ sh callBranchCloner.sh”进行调用。

也许有更好的方法,那就是不进行多次推送。

如果使用我的代码,则可能要使用凭据缓存,否则,必须输入凭据服务器时间。

对于Windows

注意:该脚本适用于linux。如果您在“ git bash”中运行该脚本,则该脚本可以运行,但是如果未安装一些特殊功能,则无法从本机控制台运行该脚本。

git config [--global] credential.helper wincred

对于Linux

git config [--global] credential.helper cache

其中[--global]表示可以选择添加--global

如果要为所有分支设置到新远程的远程跟踪:

DEST_R=remotename
for cbranch in `git branch`
do
    git checkout $cbranch
    git branch -u guru/$cbranch
done

存储为.sh文件并与“ sh filename.sh”一起运行时,会将所有上游设置为跟踪远程“ remotename”


0

由于HEAD在上一个答案中创建了额外的分支,因此我发现做到这一点的最干净的方法是克隆到裸存储库中,然后将所有分支按如下方式推送到远程:

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.