从一个遥控器到另一个 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

现在是 我希望将所有的远程分支从 ABC0推到 rorg远程。我如何做到这一点?

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

54020 次浏览

通过对一些临时存储库的快速测试,您可以构造一个 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

因此,原点/分支名称: refs/head/BRANCHNAME

正在检查我的 rorg遥控器:

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

为了补充 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。)

我找到了这个:

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

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

我需要把几根树枝从一个遥控器推到另一个遥控器上。这些答案要求以前存在本地分支

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”

这在 Zsh 中可以工作

注意,在某些情况下,为了防止意外的参数扩展,必须使用单引号。

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

由于在前面的 回答中创建了额外的 HEAD分支,所以我发现最简单的方法是克隆到一个空的存储库中,然后将所有分支推送到远程,如下所示:

git clone --bare <from-repository>
cd <from-repo-dir>
git push --set-upstream <to-repository> --all
git push --set-upstream <to-repository> --tags