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

Bja*_*sen 116 git git-push git-remote git-branch

我有以下遥控器设置:

$ git remote 
korg
rorg
Run Code Online (Sandbox Code Playgroud)

以下分支机构:

$ 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
Run Code Online (Sandbox Code Playgroud)

现在我希望将所有远程分支推korg送到rorg远程.我怎么做?

优选地,如果可以避免,则不为每个第一分支建立本地分支.

rad*_*tao 202

我找到了这个:

git push rorg 'refs/remotes/korg/*:refs/heads/*'
Run Code Online (Sandbox Code Playgroud)

它将我所有的远程分支从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
Run Code Online (Sandbox Code Playgroud)

然后你可以为tagsrefs 做同样的推动:

git push rorg 'refs/tags/*:refs/tags/*'
Run Code Online (Sandbox Code Playgroud)

  • 只是以为我应该指出这一点:该方法似乎在名为`HEAD`的远程上创建了一个实际的分支。但这可以删除。`git push rorg:HEAD` (4认同)
  • 在 git 2.10.0 上给我“一切都是最新的”,什么也没有发生,同时在各个分支上做同样的事情。 (3认同)
  • 在新的(什么版本?)git中,这应该是公认的答案.@ bjarke-freund-hansen如果您同意未来搜索者的利益,您想更改已接受的答案吗? (2认同)
  • 任何不熟悉 refs 结构并且想知道如何推送标签的人,您都需要这个命令:`git push rorg refs/tags/*:refs/tags/*`。这与“git push rorg --tags”相同,但了解这些东西在做什么是很好的:) (2认同)
  • 如果您从 Windows 命令提示符(而不是 Git Bash 或类似的东西)运行这些命令,则需要使用双引号而不是单引号。 (2认同)

pat*_*yts 44

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

所以origin/BRANCHNAME:refs/heads/BRANCHNAME

检查我的rorg遥控器:

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

  • 为什么不``git push rorg origin/one:one`(不用`refs/heads /`)代替? (5认同)
  • @exalted 因为使用 `refs/heads/` 前缀,你将远程分支推送到不需要检出到 `one` 中 (2认同)

bla*_*lah 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
Run Code Online (Sandbox Code Playgroud)

总而言之,对于源远程上的每个远程分支(不包括像HEAD这样的"指针"分支),将该ref推送到目标远程.(该${a//$SRC_REMOTE\/}位从分支名称中剥离源远程名称,即origin/master变为master.)

  • 对于我们这些需要一次性完成的人:`git push -u $ DST_REMOTE $(用于$(git branch --list --remote"$ SRC_REMOTE/*"| grep -v --regexp =' - >');回显"$ a:refs/heads/$ {a // $ SRC_REMOTE\/}";完成)` (3认同)

kel*_*ele 7

这适用于 Zsh

注意单引号是必要的,以防止在某些情况下意外的参数扩展。

git push rorg 'refs/remotes/korg/*:refs/heads/*'
Run Code Online (Sandbox Code Playgroud)