如何将裸仓库分支推送到另一个远程?

时间:2014-06-29 23:57:04

标签: git

我正在使用分散的工作流程(Central + Fork)。有时,我希望使用中央存储库中相应分支的最新更改来快速转发我的所有远程分支。

我已经创建了我的中央存储库的第二个克隆,它只是一个裸版本。使用单个git push命令,是否可以将所有分支推送到分支?我知道通配符可以用于推送,但我还没有能够让它工作。例如,我尝试了这个(我的裸仓库有两个遥控器,上游'起源&#39 ;;原点指向我的前叉,上游是中央仓库:

git push origin refs/remotes/upstream/*:refs/heads/*

我仍然觉得git的refspec令人困惑。具体来说,我不确定什么名称空间是什么。我假设所有远程分支都存储在refs/heads/*下。

1 个答案:

答案 0 :(得分:3)

只需使用

git push <fork> --all

.git/refs/heads/下的所有分支引用推送到另一个远程。

文档

git-scm documentation for git push(截断到相关选项):

git push [--all | --mirror | --tags] [<repository> [<refspec>...]]

--all
     

而不是将每个引用命名为push,指定推送refs/heads/下的所有引用。

您的原始命令应该已经工作

仅供参考,原始命令

git push origin refs/remotes/upstream/*:refs/heads/*

也应该有效,所以我不确定你的情况出了什么问题。

Refspecs Explained

根据你的说法,

  

我仍然觉得git的refspec令人困惑。具体来说,我不确定什么名称空间是什么。我假设所有远程分支都存储在refs/heads/*下。

所以这里是与

形式的refspecs的交易
<source>:<destination>
  1. 所有Git repos在.git/refs/目录下共享相同的参考目录结构。

    • 每个仓库都在refs/heads/下存储本地分支(相对于本身)。

    • 每个仓库都在refs/remotes/<remote>/下存储远程跟踪分支(相对于本身)。

    • 其他引用也可以存储在refs/下,包括但不限于refs/tags/,但我不会详细了解这些内容。您还可以在refs/下创建自己的参考目录;例如,GitHub在refs/pulls/<request-number>/下的遥控器上存储拉取请求。

  2. 冒号两侧的引用: 与refspec的那一侧代表的repo相对 。假装结肠的每一侧都有前面的回购物。

    为了便于说明,我将[source]/[destination]/添加到下面的refspec示例中,即使这实际上并不是正确的语法对他们来说。

    因此,例如,如果您想将本地分支机构推送到远程分支机构,则需要将它们 推送到远程的本地分支机构 。您可以使用这样的refspec:

    git push <remote> [source]/refs/heads/*:[destination]/refs/heads/*
    

    在上述情况下,您也可以省略:refs/heads/*,因为省略:<destination>会导致Git使用<source>侧使用的相同引用替换该方:

    git push <remote> refs/heads/*
    

    现在假设您想将本地远程跟踪分支推送到特殊的&#34;命名空间&#34;遥控器上名为refs/special/的文件夹。然后使用以下内容:

    git push <remote> \
    [source]/refs/remotes/<pick-a-remote>/*:[destination]/refs/special/*