[英]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
.pushRemote
, remote.pushDefault
和branch.
未在此处设置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 。
它认为使用origin
和remote.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
中使用远程。
接下来,我们应该清楚地区分语法(名词和动词,以便您在命令行上输入)和语义(行为)。 一旦我们抛弃了“远程”的额外种类,我们剩下两个任务:
您使用的语法是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.