Windows上的Git 2.13条件配置
Posted
技术标签:
【中文标题】Windows上的Git 2.13条件配置【英文标题】:Git 2.13 conditional config on windows 【发布时间】:2017-10-10 16:18:02 【问题描述】:Git 版本: 2.13.0.windows.1
操作系统: Windows 7
CLI: Git bash
.gitconfig
[user]
name = Gyandeep Singh
email = private@email.com
[push]
default = current
[core]
autocrlf = input
[includeIf "gitdir: ~/Documents/webstorm/corporate/"]
path = .gitconfig-work
.gitconfig-work
[user]
name = Gyandeep Singh
email = corporate@email.com
以上两个配置文件都位于同一个目录(主目录)中。
发生了什么:在公司文件夹内的文件夹(示例测试)上打开 CLI,然后运行 git config user.email
,输出为 private@email.com
。
预期:结果应该是corporate@email.com
。
是我做错了什么还是我的期望不正确?我确实遵循了 git 文档。
解决方案
您必须在 git 初始化目录上运行 git config --show-origin --get user.email
。如果它没有被 git 初始化,那么includeIf gitdir
功能将不起作用。
这很奇怪,但却是真实的。我希望它仍然有效。
【问题讨论】:
确保您的项目位于目录.../webstrom/...
。也许是webstorm
?
拼写不是问题,因为我在两个地方都验证了它的相同。
我也无法完成这项工作,使用绝对路径C:/...
、C:\...
(给出错误)、/c/...
。今晚我会更深入地研究它。
没用过这个;但是查看文档:您是否尝试过删除:
和~
之间的空格,例如[includeIf "gitdir:~/Documents/webstorm/corporate/"]
?
重要:gitdir
子句指定的路径必须结尾有斜杠,否则不起作用。所以[includeIf "gitdir/i:~/Documents/webstorm/corporate/"]
有效,但[includeIf "gitdir/i:~/Documents/webstorm/corporate"]
无效。 (git 2.24.1.windows.2)
【参考方案1】:
你的全局C:/Users/<user-name>/.gitconfig
应该有这个includeIf
:
[includeIf "gitdir:C:/Users/<user-name>/Documents/webstorm/corporate/"]
path = .gitconfig-work
您的工作 Git 存储库位于 C:/Users/<user-name>/Documents/webstorm/corporate
和 conditional
工作配置应位于 C:/Users/<user-name>/.gitconfig-work
。
这至少在 Window 的 cmd 和 Cmder 中对我有用。 git config --show-origin --get user.email
应该告诉你配置值是从哪里加载/解析的。
似乎conditional
工作配置仅在从 Git 存储库中发出时才使用。
C:\Users\<user-name>\Documents\webstorm\corporate
λ git config --show-origin --get user.email
file:C:/Users/<user-name>/.gitconfig foo@oss.com
C:\Users\<user-name>\Documents\webstorm\corporate\some-repo
λ git config --show-origin --get user.email
file:C:/Users/<user-name>/.gitconfig-work foo@company.com
C:\Users\<user-name>\Documents\webstorm\corporate\some-non-repo-dir
λ git config --show-origin --get user.email
file:C:/Users/<user-name>/.gitconfig foo@oss.com
【讨论】:
您运行git config --show-origin --get user.email
的目录是针对 Git 存储库吗?在这种情况下,它不会在普通目录上使用条件配置并回退到全局配置。
你去就是了。我在未初始化 git 的目录上运行该命令。当我在公司内部的 git repo 上尝试它时,它起作用了。非常感谢
你也不必使用完整路径,你可以使用~
,就像我在问题中所说的那样。
您还应该小心在 .gitconfig 条件中使用大写驱动器号 (C:/),而不是小号。也就是说,如果您使用的是绝对路径。
我必须附加一个斜杠才能使其工作,例如/path/to/my/dir
不起作用 /path/to/my/dir/
起作用。【参考方案2】:
您需要关闭区分大小写:将"gitdir:"
更改为"gitdir/i:"
[includeIf "gitdir/i:C:/Work/"]
path = .gitconfig-work
[includeIf "gitdir/i:C:/My/Dev/"]
path = .gitconfig-my
来自:
https://github.com/Microsoft/vscode/issues/62921#issuecomment-437693020
【讨论】:
谢谢!看起来基本上在 Windows 你必须使用gitdir/i:
,而不是gitdir
...
还需要斜杠,对我来说没有它就行不通。
看在上帝的份上,尾部的斜线浪费了我将近一个小时。谢谢!
文档对如何处理前导/尾随斜杠有非常精确的描述:git-scm.com/docs/git-config#_conditional_includes【参考方案3】:
接受的答案虽然有帮助,但不能回答问题。
在撰写本文时,includeIf 仅适用于 git 初始化的文件夹。
因此,如果您 cd 进入“~/Documents/webstorm/corporate/somegitproject”并运行命令,输出将符合预期:
$ cd ~/Documents/webstorm/corporate/somegitproject
$ git config user.email
corporate@email.com
这可能是 git 的一个缺陷,因为用户希望它在“~/Documents/webstorm/corporate/”中也能类似地工作。
【讨论】:
我的第一个猜测是这是一个错误。你认为这应该被记录吗? 不是错误,请参阅context 的 Git 邮件列表。 这是一个问题,因为如果你想克隆一个 repo,你不能设置你的 git 环境 before 克隆它,只能在之后。因此,如果您需要特定的 git 配置来克隆 repo,这是一种 catch22 情况。 @dcsan 事实证明 IncludeIf 确实在初始化的 git 存储库之外起作用,并且基于动态凭据的克隆确实有效。 @MariuszPawelski 我忘了我发表了那条评论。从那时起,我了解到git clone
实际上所做的是创建空目录,cd 进入它,git init
,此时 IncludeIf 将起作用,现在克隆发生了,并且完成后, cd 回到原来的目录。从用户的角度来看,IncludeIf 看起来像是在 git 目录之外工作,但实际上不是。【参考方案4】:
这里有错别字:
[includeIf "gitdir: ~/Documents/webstorm/corporate/"]
path = .gitconfig-work
gitdir:
后面不能有空格:
[includeIf "gitdir:~/Documents/webstorm/corporate/"]
path = .gitconfig-work
删除它将纠正已初始化 Git 存储库中的行为。
这将显示整个 Git 配置以及从中提取的 Git 配置文件:
git config --list --show-origin
CAVEAT:如果你在 Git 存储库中运行它,它会显示来自 .gitconfig-work 的值,但如果你在 ~/Documents/webstorm/corporate/,但在 Git 存储库之外。
【讨论】:
【参考方案5】:OP 得出的结论是 includeIf 功能在正常的非 git 目录中不起作用。
这至少对于配置项 core.sshCommand 来说是不正确的。如果有条件包含的 .gitconfig 配置了 core.sshCommand,则在普通非 git 目录中的 git clone 操作中使用它。
似乎不能正常工作的部分是条件包含配置的显示。这很成问题,并且会干扰跟踪损坏的配置。
【讨论】:
【参考方案6】:我使用subst D: <mapped directory>
将目录映射到Windows 机器上的驱动器。如果您想知道存储库的路径,可以在存储库上下文中使用此命令:
git rev-parse --show-toplevel
输出是这样的:
<mapped directory>/<name of repository>
所以我把它改成了:
[includeIf "gitdir:<mapped directory>/"]
path = .gitconfig-work
现在它对我有用。
【讨论】:
以上是关于Windows上的Git 2.13条件配置的主要内容,如果未能解决你的问题,请参考以下文章