Git从一个遥控器推分支到另一个?

我有以下的远程设置:

$ 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 

现在korg所有的远程分支从korgrorg远程。 我怎么做?

最好不要为每个第一个本地分支,如果这是可以避免的。

做一些临时存储库的快速testing表明你可以构build一个可以做到这一点的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 

我find了这个:

 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/* 

为了补充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”这样的“指针”分支),将该ref推送到目标远程。 ( ${a//$SRC_REMOTE\/}位从分支名称中剥离源远程名称,即origin/master变成master 。)

对于我build议你运行的任何脚本,存储或提交所有更改是明智的。

我需要把几个分支从一个遥控器推到另一个。 这些答案要求当地分行以前存在

 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”进行调用。

可能有更好的办法,那不是做几次推。

如果你使用我的代码,你可能想使用凭证caching,否则你必须input你的凭证多次。

对于Windows

注意: 这个脚本是针对linux的 。 如果你在“git bash”中运行它,那么脚本就可以工作,但是如果没有安装特殊的东西,你将无法从本地控制台运行它。

 git config [--global] credential.helper wincred 

对于Linux

 git config [--global] credential.helper cache 

其中[–global]表示可选地添加 – 全局

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

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

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

这在Zsh工作

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