繁体   English   中英

Git推送的默认遥控器

[英]Default remote for Git push

Git-config中,您可以看到:

branch.name.remote

在分支<name>上时,它告诉git fetch和git push从哪个远程获取/推送到。 推送到的遥控器可能会被remote.pushDefault(对于所有分支)覆盖。 对于当前分支,要推送到的远程可能会被branch。<name> .pushRemote进一步覆盖。 如果未配置任何远程服务器,或者您不在任何分支上,则默认将其获取为原始 remote.pushDefault保留push

现在,我有一个cloned存储库和一个名为test并已出的分支。 在这里,您可以看到克隆的存储库的config文件的内容:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = ...
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

如您所见, branch. test .pushRemoteremote.pushDefaultbranch. 未在此处设置test .remote 所以我希望当我这样做

$ git push

我会得到

fatal: No configured push destination.

但是我明白了

Everything up-to-date

看来Git使用origin而不是未配置的remote.pushDefault 但是为什么当文档说

它默认为remote.pushDefault进行推送

编辑:

Git-push中,您可以看到:

当命令行未使用<repository>参数指定在何处推送时,将查询当前分支的branch。*。remote配置以确定要推送到何处。 如果缺少配置,则默认为origin

它认为使用originremote.pushDefault之间存在冲突。

如果您查看remote.pushDefault的remote.pushDefault

remote.pushDefault
默认情况下要推送到的遥控器。 覆盖分支。 .remote适用于所有分支,并被分支覆盖。 .pushRemote用于特定分支。

因此,这意味着在推送时将覆盖默认的遥控器。 如果未设置,则不执行任何操作,并且默认的原始遥控器起作用。

请注意, remote.pushDefault已在以后添加(v1.8.3),因此当这些语义发生更改时,它将破坏很多事情。

我认为,Git的推送代码(也确实是拉)确实不必要地复杂,因为它试图保留大量的历史行为,其中一些是坏主意。

首先让我们看一下git-push文档的REMOTES部分

可以使用以下其中一项的名称来代替URL作为存储库参数:

  • Git配置文件中的远程: $GIT_DIR/config

  • $GIT_DIR/remotes目录中的文件,或者

  • $GIT_DIR/branches目录中的文件。

所有这些还允许您从命令行省略refspec,因为它们每个都包含git默认情况下将使用的refspec。

(再次,这是我的观点,这是远程控制器的名称,也是我今天真正应该保留的唯一方法。我认为指定的URL方法可能应该移至管道命令,而git push可能会恢复为一个简单的脚本,尽管Windows上的Git人士由于Windows性能问题而试图从脚本转换过来 。)

幸运的是,您正在使用named-remote方法,因此我们可以忽略其中的大部分。 具体来说,refspec是可选的,因为您正在$GIT_DIR/config中使用远程。

接下来,我们应该清楚地区分语法(名词和动词,以便您在命令行上输入)和语义(行为)。 一旦我们抛弃了“远程”的额外种类,我们剩下两个任务:

  1. 选择一个遥控器。
  2. 选择一个参考规格。

您使用的语法git push ,即,没有指定的repository参数,也没有指定的refspec 因此,对于第1步,选择一个远程服务器,Git使用您在编辑中引用的段落:找到当前分支(在本例中为test ,然后查找branch.test.remote 没有配置(“丢失”),因此Git退回到使用origin

(有没有在报价文档段落中的错误,因为它没有提到branch. branch .pushRemote在这种情况下将branch.test.pushRemote正确的顺序是:(1)寻找具体的分支pushRemote;(2 )查找特定于分支的远程;(3)如果Git版本1.8.3或更高版本,查找remote.pushDefault ;(4)尝试单词origin 。此文档错误仍在git 2.8.1中。)

由于origin 有效的远程名称,因此第1步成功,然后继续进行第2步,选择一个refspec。 这部分不会让您感到困惑,只是为了完整性:

当在命令行中没有指定,可以把什么样refspec ...参数或--all--mirror--tags选项,该命令将查找默认refspec通过咨询remote.*.push配置,如果不是找到后,将使用push.default配置来决定要推送的内容(有关push.default的含义,请参见git-config(1) )。

因此,在这种情况下,Git会查找remote.origin.push并且由于未设置,因此会push.default 如果未设置push.default ,则存在一个“默认默认值”,它在Git 2.0之前的版本中已matching ,并且现在(Git 2.0或更高版本) simple 默认的push.default表示始终有一个push.default

默认的远程名称origin表示通常有一个远程服务器。 仅当$GIT_DIR/config没有[remote "origin"]部分时,此操作才会失败。

答案并不像获取那样简单,因为需要考虑一系列故障预置:

要以编程方式获取远程,请参阅此问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM