git config:"remote.origin.push"与"push.default"的区别

4
以下命令是如何实现的:

如何通过以下命令:

git config remote.origin.push refs/heads/master:refs/heads/master

与以下命令相关:

git config push.default <option>

(使用 --local--global 选项之一)

其中 <option> 是以下之一:

nothing
matching
upstream (formerly tracking)
current
simple

我认为我理解了第二条配置命令,但是我不明白第一条命令如何与第二条命令相互制约/相关。以下是一些提供问题背景的参考资料:

1个回答

8
当你运行时:
git push origin ...

无论在push.default设置了什么,都会被remote.origin.push覆盖。更一般地,如果未设置remote.name.push(这里的nameorigin),Git将回退到push.default,如果也没有设置,则回退到链接中描述的内置默认值。
编辑:如下Breaking Benjamin's comment below以及我对其的回复中所指出的,如果存在至少一个refspec的...部分,则该refspec会覆盖remote.origin.push。 因此,仅当您在命令行上明确或隐式命名origin并省略所有refspecs时,remote.origin.push才适用。例如,没有参数的git push发现origin,或者没有其他参数的git push origin,Git将查找您的remote.origin.push设置并使用它;但是git push origin xyz不使用您的remote.origin.push设置。当然,上面的...部分可以包括更多标志,因此此时正确的问题是...部分是否包含任何refspecs。)

请注意:

git config --local na.me value

--local和没有加--local是一样的。在设置值(如此处)时,--local--global--file filename选项控制值的设置位置,但默认为--local

(获取值时:

git config na.me

[或者git config --getgit config --get-allgit config --get-regexp],--local等选项限制了git读取的位置,如果没有指定选项,则从所有位置读取,"最本地"的设置将覆盖"不太本地"的设置,如果一个设置在多个位置都有。

谢谢!- 当你说 git push origin ... 时,... 应该是分支名称(如果提供了),对吗? - Amelio Vazquez-Reina
1
是的(或任意引用规范,例如“refs/tags/foo”,“:refs/deleteme”等)。 - torek
如果我提到了 git push origin branchName,那么它将被解析为 git push origin branchName:refs/heads/branchName。那么 remote.origin.push 又会如何发挥作用? - Number945
2
git push 的文档说明了只有在运行 git push <remote> 时没有 <refspec> 部分时,remote.<remote>.push 才会生效。如果 提供<refspec> 部分,则空的目标部分意味着重复源部分。但是请注意,git push origin xyzxyz 部分的 未限定 引用并不一定转换为一个 分支 名称。有一件事情不清楚,就是在所有情况下它如何进行转换(例如,如果您同时拥有 xyz 分支和 xyz 标签,但远程仅有 xyz 标签)。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接