“理解”;git remote show“;命令输出。。。这是“的意思;为';git推送'&引用;?

“理解”;git remote show“;命令输出。。。这是“的意思;为';git推送'&引用;?,git,github,git-branch,Git,Github,Git Branch,我有两个远程和两个本地分支机构: 本地分支“主”正在跟踪远程分支“源/主” 本地分支“镜像”正在跟踪远程分支“github/master” 这在我的.git/config文件中: ... [remote "origin"] url = http://my.gitlab.com/nandoquintana/repo.git fetch = +refs/heads/*:refs/remotes/origin/* [remote "github"] url = https

我有两个远程和两个本地分支机构:

  • 本地分支“主”正在跟踪远程分支“源/主”
  • 本地分支“镜像”正在跟踪远程分支“github/master”
这在我的.git/config文件中:

...

[remote "origin"]
    url = http://my.gitlab.com/nandoquintana/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[remote "github"]
    url = https://github.com/nandoquintana/repo.git
    fetch = +refs/heads/*:refs/remotes/github/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "mirror"]
    remote = github
    merge = refs/heads/master
[push]
    default = tracking
这是“git remote show origin”的输出:

“推”和“拉”命令都能正常工作:

  • “push”命令将本地分支中提交的编辑发送到“她的”远程分支
  • “pull”命令将提交从远程分支带到“她的”本地分支
那么,为什么“为‘git push’配置的本地ref”是“master push到master”?为什么不“镜子推给主人”?“本地过时”是什么意思

更新了@torek回答后的

以下是一些参考文献:

$ git ls-remote github
455063a9db09977535ac808af5729181b153f4c7    HEAD
455063a9db09977535ac808af5729181b153f4c7    refs/heads/master

$ cat .git/refs/heads/master
ca9e4399058a4998bd7c993f86d6740cfaec820b
$ cat .git/refs/heads/mirror
455063a9db09977535ac808af5729181b153f4c7
$ cat .git/refs/remotes/github/master
455063a9db09977535ac808af5729181b153f4c7
确切地说,“refs/remotes/github/master”和“refs/heads/master”并不相等。这就是出现“本地过期”消息的原因:

master pushes to master (local out of date)
这对我来说不是问题,我肯定知道“remotes/github/master”和本地“master”中的代码是不同的

然而,“remotes/github/master”和本地“mirror”中的代码是相同的。实际上,refs“refs/remotes/github/master”和“refs/heads/mirror”是相等的

这是一条让我心安的信息:

mirror pushes to master (up to date)
mirror pushes to master (up to date)

如何配置远程/github。。。或推送。默认。。。要获得此输出?

[对我自己和OP来说,一些提醒:remote
origin
=GitLab,remote
github
=github。从根本上说,使用
git remote show
的主要问题是它会做出一些假设。这些假设是关于将来如何运行其他git命令-
git fetch
git push
,关于这些Git命令中涉及的第二个Git存储库将来将如何布局。显然,安:很难做出预测,特别是关于未来。]

让我在这里回答顶部编辑的问题:

这是一条让我心安的信息:

mirror pushes to master (up to date)
mirror pushes to master (up to date)
如何配置remote/github…或push.default…以获取此输出

有一件事值得一试:一次
push。默认设置,
upstream
,告诉Git默认情况下,
Git push
应该做到这一点。如果这样做有效并且满足了您的要求,那么您已经做好了准备。但是请注意,不管Git在这里说什么,这都是谎言

基本问题是,
mirror
不会推送到
master
直到你输入一个
git push
命令,它根本不会推送到任何东西;一旦你输入了这个命令,你就可以用这个
git push
命令控制它的去向,这个命令可以完全覆盖任何声明
git remote如何制作

您在推送git时的选择是:

  • 不提供其他参数

    在这种情况下,您的Git从当前上游选择远程。如果上游设置为
    origin/..
    ,则远程为
    origin
    。如果上游设置为
    github/..
    ,则远程为
    github
    。看起来像是一个简单的字符串替换(通常是这样,尽管出于历史原因,它实际上是一个非常复杂的字符串替换,结果通常很简单:在斜杠之前取一部分)

    此时,您的Git将继续处理这里列出的第二个案例

  • 提供一个附加参数。此参数命名要连接到的另一个Git。它通常是远程(
    origin
    github
    ),但此时您可以提供URL

  • 提供两个或多个附加参数。这些参数中的第一个名称是远程(或URL)。其余的是refspec,定义如下

此时,您的Git连接到该远程,实际上运行
Git ls remote
,查看它们有哪些分支。此列表非常重要,因为它与您提供的或未能提供的refspec一起使用,这取决于您的
推送。默认设置,以及当您提供refspec时,您只能提供半个refspec

这是“半个参考规范”不管你做了什么或设置了什么,如果你在
mirror
上运行
git-push-github-mirror
,你的git会要求远程
github
上的git进行设置……这取决于你是否有上游设置,如果没有,则取决于你的
push.default
设置。细节以Git通常的神秘形式显示在中。不过,默认情况是对于“半参考规范”,名称
mirror
表示
mirror:mirror

如果您提供完整的refspec,例如,
git push github mirror:asdf
,refspec的后半部分将确定git要求其git设置的分支名称。如果您提供了半个refspec,则您提供的一半通常会同时成为两个名称。默认值为
push.default=simple
,您不能意外推送
镜像
对于其他任何人的
主控
,必须使用显式的完整refspec(然后由您决定是否正确)

如果您不提供refspec,您的Git将返回到push.default,并且只有五个设置。默认设置是
simple
,让您的Git将您的分支集与其分支集进行比较(从
Git ls remote
)。如果您的分支(如
mirror
)在那里没有任何相应的分支,您的Git将不会要求其Git设置任何分支

假设您位于分支
mirror
,该分支的上游设置为
github/master
,并且您已将
push.default
配置为
上游
(使用
git config p
I have these references:
  refs/heads/master  <some big ugly hash ID>