如何将裸仓库回购分支推到另一个遥控器?

voi*_*ter 5 git

我正在使用去中心化工作流程(中央+叉子)。有时,我想将叉子上的所有远程分支与中央存储库中相应分支的最新更改一起快速转发。

我已经创建了中央存储库的第二个克隆,它只是一个裸版本。使用单个git push命令,是否可以将所有分支推入叉子?我知道通配符可用于推入,但我无法使其工作。例如,我尝试了此操作(我的裸仓库中有两个远程服务器,“上游”和“原始”;起源指向我的叉子,上游是中央仓库:

git push origin refs/remotes/upstream/*:refs/heads/*
Run Code Online (Sandbox Code Playgroud)

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

小智 6

只需使用

git push <fork> --all
Run Code Online (Sandbox Code Playgroud)

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

文档

git-scm 文档git push(截断为相关选项):

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

--all
Run Code Online (Sandbox Code Playgroud)

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

您的原始命令应该有效

仅供参考,您的原始命令

git push origin refs/remotes/upstream/*:refs/heads/*
Run Code Online (Sandbox Code Playgroud)

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

参考规格说明

照你说的,

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

所以这里是处理表单的refspecs

<source>:<destination>
Run Code Online (Sandbox Code Playgroud)
  1. 所有 Git 存储库在其.git/refs/目录下共享相同的参考目录结构。

    • 每个回购存储本地分支(相对于本身)下refs/heads/

    • 每个 repo 将远程跟踪分支(相对于自身)存储在refs/remotes/<remote>/.

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

  2. 冒号每一侧的引用: 都相对于 refspec 的那一侧表示的 repo。假设冒号的每一侧都在该侧添加了 repo。

    出于说明目的,我将在下面的 refspec 示例中添加[source]/[destination]/,即使这实际上并不是它们的正确语法。

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

    git push <remote> [source]/refs/heads/*:[destination]/refs/heads/*
    
    Run Code Online (Sandbox Code Playgroud)

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

    git push <remote> refs/heads/*
    
    Run Code Online (Sandbox Code Playgroud)

    现在假设您想将本地远程跟踪分支推送到远程名为refs/special/. 然后您使用以下内容:

    git push <remote> \
    [source]/refs/remotes/<pick-a-remote>/*:[destination]/refs/special/*
    
    Run Code Online (Sandbox Code Playgroud)