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/&lt;user-name&gt;/Documents/webstorm/corporateconditional 工作配置应位于 C:/Users/&lt;user-name&gt;/.gitconfig-work

这至少在 Window 的 cmdCmder 中对我有用。 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: &lt;mapped directory&gt; 将目录映射到Windows 机器上的驱动器。如果您想知道存储库的路径,可以在存储库上下文中使用此命令:

git rev-parse --show-toplevel

输出是这样的:

<mapped directory>/<name of repository>

所以我把它改成了:

[includeIf "gitdir:<mapped directory>/"]
    path = .gitconfig-work

现在它对我有用。

【讨论】:

以上是关于Windows上的Git 2.13条件配置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 上的 git 配置中修复“ssh 权限被拒绝,请重试错误”

centos7.3 编译安装 git 2.13

Windows 7 上的 Python-LDAP 身份验证

wind10优化

windows下安装kafka

windows下安装kafka