我尝试更改 git 配置,但它不会更改。相反,它显示了两个设置?!

I tried to change a git config, but it won't change. Instead it shows both settings ?!

当我做的时候

git config --list

我明白了

core.filemode=true

我也是

git config --global core.filemode false

现在当我列出我得到的配置时

core.filemode=false
core.filemode=true

这是什么意思?以及如何才能成功将其更改为 false only

编辑:git config --list --show-origin 表明

file:/home/me/.gitconfig core.filemode=false
file:.git/config  core.filemode=true

那是哪一个?

Git 支持本地和全局配置。本地配置优先于全局配置。参见

file:/home/me/.gitconfig core.filemode=false  # Your Global Config
file:.git/config  core.filemode=true          # Your Local Config

来自 Git 配置页:

Finally, Git looks for configuration values in the configuration file in the Git directory (.git/config) of whatever repository you’re currently using. These values are specific to that single repository, and represent passing the --local option to git config. If you don’t specify which level you want to work with, this is the default. https://www.git-scm.com/book/en/v2/Customizing-Git-Git-Configuration

因此,要为您的存储库将其设置为 false,只需设置:

git config --local core.filemode false

请注意,您还可以在您选择的任何编辑器中像编辑普通文件一样编辑.git/config

线索在--global标志中。在您的主目录中有一个全局的 .gitconfig,在回购协议中有一个可选的本地目录。这就是 --show-origin 向您展示的内容。

正如在所有此类 global/local 配置系统中所期望的那样,对于所有重叠的设置,本地系统将覆盖全局系统。

如果您希望 core.filemode 为假,您有三个选项(即只执行其中之一):

  1. 通过执行与之前相同的命令但不使用 --global:

    ,在 repo 本地配置中将其设置为 false
    git config core.filemode false
    

    之所以可行,是因为默认情况下新设置是在本地进行的。 如果您不希望有本地设置,您可能有 过去遗漏 --global 不小心创建了这个文件。

  2. 在 repo 本地配置中取消设置,以便应用全局配置:

    git config --unset core.filemode
    
  3. 如果不需要本地设置,只需要全局设置,请删除 repo 本地配置。或者为了安全起见,将文件重命名为其他名称,直到您确定其中没有您需要的任何内容 - 如果这样做,您可以将这些设置复制到全局(如果合适的话)。

    ℹ️ I included this option for completeness. But there are almost always repo-specific values, e.g. configuration of remotes and remote tracking branches, so it you probably should use option 2 for settings that should defer to your global config.

and 都提到了重复的原因——也就是说,该设置现在同时存在于全局 .gitconfig 和本地 .git/config 文件中,而且更本地化的文件设置会覆盖更全局的设置。

这里还有另外两个有趣的地方。一个特定于 core.filemode(又名 core.fileModethe git config documentation 两种方式拼写)。另一个通常适用于某些 Git 配置设置。

当 Git 命令启动时,它会读取尽可能多的 Git 配置文件。至少有三个标准集:系统范围的配置,通常在 /etc/gitconfig/usr/local/etc/gitconfig 中,然后是您自己的全局文件,通常在 $HOME/.gitconfig 或 [=18= 中] 或类似的,最后是 .git/config 中的每个存储库配置。 大多数设置仅保留最后一个值,因此如果/etc/gitconfig设置color.grep.filename = red,但您的全局文件设置color.grep.filename = bluegit grep 文件名将显示为蓝色——除非您的本地文件再次覆盖它。如果您的本地文件中有多个 条目 ,最后一个将被覆盖。

一些Git设置,但是,积累。例如,在正常(完整)克隆中,remote.origin.fetch 通常在您的本地 .git/config 中设置为 +refs/heads/*:refs/remotes/origin/*。但是,单分支克隆会将此设置为 +refs/heads/somebranch:refs/remotes/origin/somebranch。这就是使克隆首先成为单分支克隆的原因。使用 git remote set-branches --add,您可以一个接一个地添加 个单独的分支 ;每个都添加 一个 remote.origin.fetch 条目。

无论哪个文件包含该设置,这种累积都适用。这意味着可以设置 Git 以使用全局 Git 配置文件中的 fetch 设置复制所有 GitHub 拉取请求。 (我不 推荐 这个——它积累了很多废话,例如——但它是 可能的 。)

最后,让我们注意 core.filemode 控制 Git 是否相信对工作树中的文件执行的 chmod +xchmod -x 操作应该被复制回当您 运行 git add 时,Git 索引中的条目。对于 new 文件,它控制 lstat system call 结果中的 x 位是否使此 Git 索引条目成为 mode 100755 (+x)或 mode 100644 (-x)。 Git 在您使用 git initgit clone 创建新存储库时设置此项 根据您的操作系统的行为以及在其中创建存储库的文件系统。 更改设置对于某些特殊情况可能很有用,但通常是不明智的:非常确定您知道自己在做什么。