在Git-config中,您可以看到:
branch.name.remote
当在分支< name>上时,它告诉git fetch和git push哪个远程到 从/推送到。可以覆盖要推送的遥控器 remote.pushDefault(适用于所有分支)。远程推送,为 当前分支,可以被分支进一步覆盖。< name> .pushRemote。 如果没有配置远程,或者您不在任何分支上,那么 默认为原始提取和 remote.pushDefault 推送 。
现在我有一个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
< / strong> .remote
未设置在那里。所以我希望我什么时候
$ git push
我会得到
fatal: No configured push destination.
但是我得到了
Everything up-to-date
似乎Git
使用origin
而不是未配置remote.pushDefault
。但是为什么当文档说
推送 默认为 remote.pushDefault 。
编辑:
在Git-push中,您可以看到:
当命令行没有指定推送的位置时 &LT;库&GT;参数,分支。*。当前的远程配置 咨询分支以确定推送的位置。如果配置 缺少,默认为 origin 。
它认为使用origin
和remote.pushDefault
之间存在冲突。
答案 0 :(得分:3)
如果你看一下remote.pushDefault
的表达式:
remote.pushDefault
默认情况下推送到的遥控器。覆盖分支。 .remote为所有分支,并被分支覆盖。 .pushRemote for specific branches。
所以这意味着在推送时覆盖默认遥控器。当它没有设置时,它什么都不做,并且默认的原点远程起作用。
请注意,稍后添加了remote.pushDefault
(v1.8.3),因此当这些语义发生变化时,它会破坏很多东西。
答案 1 :(得分:3)
Git的推送代码(也是拉,真的)是(在我看来)不必要的复杂,因为它试图保留大量的历史行为,其中一些是坏主意。
让我们先来看the REMOTES section of the git-push
documentation:
可以使用以下某个名称而不是URL作为 repository 参数:
Git配置文件中的遥控器:
$GIT_DIR/config
,
$GIT_DIR/remotes
目录中的文件或
$GIT_DIR/branches
目录中的文件。所有这些也允许你从命令行中省略refspec,因为它们都包含一个gs默认使用的refspec。
(遥控器的名称 - 再次,这只是我的意见 - 这是其中唯一一个真正应该存在的。我认为指定的URL方法可能应该转移到管道命令,{{1可能会返回到一个简单的脚本,尽管由于Windows性能问题,Git-on-Windows人员试图从脚本转换远。)
幸运的是,您使用的是named-remote方法,因此我们可以忽略其中的大部分内容。具体来说,refspec是可选的,因为您在git push
中使用了一个遥控器。
接下来,我们应该清楚地区分语法(名词和动词以及您在命令行中输入的内容)和语义(行为)。一旦我们抛弃了额外的“远程”变种,我们就会完成两项任务:
您使用的语法是$GIT_DIR/config
,即没有指定 git push
参数,也没有指定 repository
< / em>的。因此,对于第1步,选择一个遥控器,Git使用您在编辑中引用的段落:找到当前分支 - 在这种情况下为refspec
- 然后查找test
。这没有配置(“缺失”),因此Git回退到使用branch.test.remote
。
(引用的文档段落中有一个错误,因为它没有提及origin
,在这种情况下将是branch.branch.pushRemote
。正确的顺序是(1)寻找特定于分支的pushRemote ;(2)寻找特定于分支的远程;(3)如果Git版本1.8.3或更新版本,则查找branch.test.pushRemote
;(4)尝试单词remote.pushDefault
。此文档错误仍在git中2.8.1。)
由于origin
是有效的远程名称,步骤1会成功,我们继续执行步骤2,选择refspec。这部分不会让你感到困惑,只是为了完整性:
当命令行未指定使用
origin
推送的内容时 参数或refspec ...
,--all
,--mirror
选项,命令找到 默认--tags
,咨询refspec
配置,如果是的话 找不到,尊重remote.*.push
配置来决定推送什么 (有关push.default
)的含义,请参阅git-config(1)
。
因此,在这种情况下,Git会查找push.default
,因为未设置remote.origin.push
。如果未设置push.default
,则会出现“默认默认值”,在2.0之前的Git中为push.default
,现在为(Git 2.0或更新版本)matching
。此默认值simple
表示总是一个refspec。
默认远程名称push.default
表示通常一个遥控器。仅当origin
中没有[remote "origin"]
部分时,此操作才会失败。
答案 2 :(得分:0)
答案并不像获取那样简单,因为需要考虑一系列故障预置:
要以编程方式获取远程,请参见this question。