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
所有的远程分支从korg
到rorg
远程。 我怎么做?
最好不要为每个第一个本地分支,如果这是可以避免的。
做一些临时存储库的快速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/*'