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

时间:2011-10-19 09:06:04

标签: git git-branch git-push git-remote

我设置了以下遥控器:

$ 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推送到rorg远程。我该怎么做?

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

6 个答案:

答案 0 :(得分:194)

我找到了这个:

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 refs进行同样的推动:

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

答案 1 :(得分:41)

快速测试制作一些临时存储库显示您可以构建一个可以执行此操作的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

答案 2 :(得分:13)

为了补充patthoyt's answer,这是一个简短的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。)

答案 3 :(得分:4)

这适用于Zsh

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

答案 4 :(得分: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'

答案 5 :(得分:0)

由于在上一个answer中创建了额外的private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); label1.Text=indata (does not work) } 分支,因此我发现最干净的方法是克隆到裸仓库中,然后按如下所示将所有分支推送到远程:

HEAD