为什么全局git配置“ remote.origin.push”会覆盖本地的“ remote.origin.push”?

时间:2019-06-15 11:16:16

标签: git git-config

# git version 2.22.0.windows.1

# create simulation repos
git init --bare server
git init client

# set global and local config
git config --global remote.origin.push refs/heads/*:refs/for/*
cd client
git remote add origin ../server
git config remote.origin.push refs/heads/*:refs/heads/*

# create and push "master"
touch a.txt
git add a.txt
git commit -m foo
git push origin master

预计本地refspec refs/heads/master:refs/heads/master将起作用。但是,将创建refs/for/master。我删除refs/for/master并尝试使用-c

git push origin :refs/for/master
git -c remote.origin.push=refs/heads/*:refs/heads/* push origin master

再次创建refs/for/master而不是refs/heads/master

我在全局配置中删除remote.origin.push,然后重试,然后按预期创建了refs/heads/master。我还要进行这些测试。

global refs/heads/*:refs/for/*
local  refs/heads/*:refs/hello/*
result refs/for/master

global refs/heads/*:refs/hello/*
local  refs/heads/*:refs/for/*
result refs/hello/master

global refs/heads/*:refs/for/*
local  unset
result refs/for/master

global unset
local  refs/heads/*:refs/hello/*
result refs/hello/master

我什至在系统配置中添加了一个推送refspec,这也会导致意外的结果。

system refs/heads/*:refs/world/*
global refs/heads/*:refs/hello/*
local  refs/heads/*:refs/heads/*
result refs/world/master

然后测试user.name

system systemname
global globalname
local  localname
result localname

事实证明,与其他配置变量相比,remote.origin.push的优先顺序是相反的。

我很困惑,因为它不像我所相信的那样起作用。这是一个错误还是我错过了git config的任何细微功能?

1 个答案:

答案 0 :(得分:4)

在这种情况下,并不是以不同的顺序读取配置,而是推送引用规范是可加的。换句话说,可以在remote.<remote>.push中指定多个push refspec选项,它们都将按照从配置文件中读取的顺序生效。

但是,Git只会将一组源引用推送到一个地方。由于您已经为refs/heads/*指定了目的地(通过在较早的配置文件中列出),因此以后的目的地都不会覆盖它。您可以通过在命令行上同时列出这两个内容来查看:

$ git push $TMP/test-repo refs/heads/*:refs/for/* refs/heads/*:refs/heads/*
Enumerating objects: 105, done.
Counting objects: 100% (105/105), done.
Delta compression using up to 4 threads
Compressing objects: 100% (93/93), done.
Writing objects: 100% (105/105), 32.96 KiB | 3.00 MiB/s, done.
Total 105 (delta 41), reused 0 (delta 0)
remote: Resolving deltas: 100% (41/41), done.
To /tmp/user/1000/test-repo
 * [new branch]      master -> refs/for/master

因此,如果您的全局配置文件指定了refs/tags/*:refs/tags/*,而本地配置文件指定了refs/heads/*:refs/for/*,则两者都会生效,因为它们不会重叠。

如果在这种情况下需要其他行为,则需要删除全局和系统配置,或者在本地存储库中切换远程名称。