为什么 .gitconfig [includeIf] 不起作用?

33

系统设置: MacOS Catalina 10.15.6

> git --version
git version 2.24.3 (Apple Git-128)

文件:~/.gitconfig

[user]
    name = nickname
    email = nickname@gmail.com
[includeIf "gitdir:~/Business"]
    path = ~/.gitconfig-work

文件: ~/.gitconfig-work :

[user]
    name = First Last
    email = fl@work.com

尝试在终端上检查配置时的输出:

(base) MBP-Name:~ myname$ cd ~/Business/
(base) MBP-Name:Business myname$ git config --get user.name
nickname

我已尝试在配置文件中为gitdirpath使用相对路径~和绝对路径/,并在每次更改后重新启动bash。我也阅读了几个stackoverflow的问题,但没有成功。一些建议添加i选项以实现不区分大小写,但这并没有解决问题。

有任何想法吗?


30
~/Business/ 是一个代码仓库(工作树)吗?如果不是,请提示:includeIf 只在 ~/Business/ 目录下的 代码仓库 中有效,而不能在非仓库目录中使用。 - phd
10
@phd,你是完全正确的。我必须将 "gitdir:~/Business"更改为 "gitdir:~/Business/"并在repo文件夹内运行该命令。谢谢 <3 - entropyfever
1
@entropyfever 很有帮助。你应该把它作为答案添加... :D - Melvin Abraham
1
花了我几个小时才弄清楚为什么它不起作用。覆盖的配置只有在你处于 git 目录中时才可见,否则它总是显示全局值。 - Daniel B
遇到了与作者描述类似的问题,但根本原因不同。 在全局 git 配置中,includeIf 应该在用户配置之后编写。在我的情况下,我将 includeIf 放在配置文件的最前面,结果它没有起作用。 - undefined
10个回答

12

2
这对我来说是个问题,非标准引号(“ ”)和标准引号(" ")之间的区别。 去掉花式引号就可以了。 - MrInvolved
Uuuuuuuuuuuuugh +1 - Madbreaks

7

我花了很多时间尝试调试,但每次都不起作用。

所以我决定删除并重新开始。 这就是我做的:

创建.gitconfig

[includeIf "gitdir:~/Documents/home/"]
path = ~/.gitconfig.home
[includeIf "gitdir:~/Documents/work/"]
path = ~/.gitconfig.work

创建 .gitconfig.work 文件。
[user]
name = My Name
email My work email

创建 .gitconfig.home

[user]
name = My Name
email My personal email

然后,我在两个文件夹中都初始化了git(git init):~/Documents/work/ 和 ~/Documents/home/。 初始化完成后一切如预期运行。 希望这对你有帮助,以防你遇到类似问题。 在Mac和Windows上进行了测试。

2
感谢帮助。秘密是在这些文件夹上运行git init命令。 - PinoSan
在文件夹上运行git init可以使其正常工作。 - lu_ke____
奇怪的是,这对我来说不起作用。我将我的家设置为默认值,工作只适用于一个区域,但是我改变了这个设置来尝试解决问题,但没有成功。所有的git提交都有正确的用户,但是git push却尝试使用错误的用户。即使彻底删除仓库并重新克隆也没有起作用。 - Vala
2
对于其他遇到类似问题的人,我找到了原因:如果你有一个~/.ssh/config文件为你的远程设置了用户名,那么它将始终优先于git配置。也就是说,如果你为远程设置了IdentityFile配置,请确保不要设置User属性。 - Vala
对于GitHub上的公共存储库来说,它特别隐藏了用户对于克隆操作并不重要,但对于推送操作却很重要。 - Vala

5
我知道这个问题已经有点老了,但是我遇到了类似的问题,解决方法非常简单,所以我想分享一下,以防其他人也遇到同样的问题:问题就是你的目录末尾应该有一个斜杠(/)...
所以对于原帖的情况,
[includeIf "gitdir:~/Business"]

应该简单变成
[includeIf "gitdir:~/Business/"]

希望这对你有所帮助!


3
我自己也遇到了.gitconfig的问题。我读了几遍文档,搜索了Stackoverflow和一些博客文章。我认为我已经尝试了所有可能的解决方案:相对路径、尾随斜杠、不同的引号等等。但是我尝试的所有解决方案都没有起作用。
我试图使用[include]来包含一个文件,但也没有成功。
经过几个小时的尝试和搜索答案,我看到了一篇文章,提到可以包含一个.txt文件作为.gitconfig的替代品。我将文件从.gitconfig-{company}更改为gitconfig-{company}.txt,并在全局.gitconfig中重命名路径,一切立即生效!
希望这对你和未来的搜索者有所帮助。

我认为.gitconfig文件必须以.gitconfig结尾,例如.github.gitconfig,这是我使用的方式。 - mbomb007
全局的那个可以。但是每当我试图通过 [includeIf] 导入一个文件时,我需要添加 .txt 扩展名才能使其正常工作。我花了很长时间才弄清楚,因为每个例子都说它应该只是 .gitconfig-{company}。也许有某个设置启用了,导致我的系统只检查 .txt。也许还有人遇到类似问题,并发现 .txt 对他们也适用 :) - BerendPronk
你尝试过 .{company}.gitconfig 吗? - mbomb007
可以尝试一下。感谢您的见解。示例说这并不重要,但那样似乎更合理。 我只是想让你们知道,一个 .txt 文件也足够了。 - BerendPronk

2
这个问题的答案就是在目录末尾加上斜杠'/'。你会发现即使有人做了其他的修复措施,他们也会在末尾加上斜杠,而且自己都没有意识到。

你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好的回答的更多信息。 - undefined
这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审查 - undefined
这是正确的答案!:) - undefined

1

简短版

  1. 在假设它像其他东西一样工作之前,请确保测试此 includeIf 业务。在许多情况下,它似乎无法立即正常工作。
  2. 由于某种原因,git 直到我使用 git config 进行一些随机更改后才能检测到更改。(注意:我在 win10 上)

详细版

首先,请确保查看本帖中的其他答案,因为每个帖子似乎都会提供不同的潜在问题。

现在这就是发生在我身上的事情(注意:我在 Windows 10 上):

  1. 打开~/.gitconfig文件并添加includeIf条目
    • 例如:
      [includeIf "gitdir:~/x/"]
      path = ~/.x.gitconfig
      
  2. 创建自定义的~/.x.gitconfig文件并覆盖一些设置,例如设置a.b=c(确保与默认值不同,以便首先进行测试)
  3. 注意:此答案声称这不会影响旧目录,但我尚未测试。
  4. 进入目录(cd ~/x)并进行测试。例如,我尝试了git config a.b,它给了我错误的值。
  5. 我意识到该文件夹尚未进行git init,因此我运行了git init,但它仍然无法工作。
  6. 解决方案:我通过git config some thing进行了随机本地配置更改
  7. 再次测试,它立即起作用并始终立即捕获所有更改。现在它可以正常工作了!

1

我试图将两个用户添加到同一个gitconfig文件中,但是它对我来说无法工作。因此,我为每个用户创建了一个gitconfig文件,这样就可以了!

~/.gitconfig

[includeIf "gitdir/i:~/Documents/Personal/"]
    path = ~/.gitconfig_personal

[includeIf "gitdir/i:~/Documents/Work/"]
    path = ~/.gitconfig_work

~/.gitconfig_personal

[user]
    name = Your Personal Name
    email = your_personal@email.com

~/.gitconfig_work

[user]
    name = Your Work Name
    email = your_work@email.com

0

我在使用[includeIf "gitdir:~/foo"]后,也遇到了奇怪的行为,有时候它能正常工作,有时候却不能。

因此,我深入研究了Git的git-config官方文档

gitdir

紧随关键字gitdir:之后的数据将被用作全局模式。如果.git目录的位置与该模式匹配,则满足包含条件。

.git位置可能是自动发现的,也可能来自$GIT_DIR环境变量。如果通过.git文件(例如来自子模块或链接的工作树)自动发现存储库,则.git位置将是最终存储.git目录的位置,而不是.git文件所在的位置。

我个人觉得这个设计很奇怪... 这意味着你的 ~/.gitconfig 中的 [includeIf "gitdir:~/foo"] 可以在你执行 cd ~/foo/existed_project && git fetch 时被触发,但是当你执行 cd ~/foo && git clone 时不会被触发,因为目录 ~/foo/.git/ 不存在...

显式设置环境变量 GIT_DIR=~/foo 似乎也不起作用(可能是因为 ~/foo/.git 仍然不存在?)。

据我所知,解决这个问题的一个更简单的方法是执行 ~/foo && git init... 我不知道是否有更好或更规范的做法,我已经搜索了好几个小时了。


0

问题

在我的情况下,[includeIf] 没有起作用,因为我的配置文件在 C: 盘 (C:\Users\User\.gitconfig),但我的工作项目在 D: 盘 (D:\Projects\Work\)。

解决方案

在我的情况下应该是:

[includeIf "gitdir/i:Work/"]

而不是:

[includeIf "gitdir/i:~/Work/"]

文档


-1
这将只影响使用 git init 创建的未来项目。之前的项目将保持不变。

这并没有回答问题。一旦您拥有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案。- 来自审核 - Thomas Smyth - Treliant
1
不正确的信息 - Matt Bracewell

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