NotIf或Else条件gitconfig

13

根据这篇 Stack Overflow 的帖子相关指南,我设置了以下的条件配置...

$ cat ~/.gitconfig 
[user]
    name = Random J. Hacker
    email = RandomJ@hack.er
[includeIf "gitdir:~/work/*"]
    path = ~/work/.gitconfig

$ cat ~/work/.gitconfig 
[user]
    name = Serious Q. Programmer
    email = serious.q@programmer.biz
在这种方式下,当我为程序员公司工作时克隆的所有存储库都会将我的@programmer.biz工作电子邮件地址指定为默认的--author凭据;而我在桌面、/tmp~/.vscode或其他任何地方克隆的每个随机存储库都会分配我的超级合法的@hack.er凭据作为作者。不幸的是,我注意到以下行为...
$ git clone git@github.com:programmerbiz/repo.git
$ cd repo/
$ git config --list | grep user
user.name=Random J. Hacker
user.email=RandomJ@hack.er
user.name=Serious Q. Programmer
user.email=serious.q@programmer.biz

哦不!我的@hack.er用户被商业仓库选中了!

我想自动配置所有存储库的一个且仅一个默认[user],而不需要使用bash脚本。在~/.gitconfig中是否有includeIf.Not运算符、[else]块语法或类似语法可用于实现此目的呢?根据条件包含文档,似乎不支持这种用例。


2
怎么样在正常的[user]部分加上else语句,然后再加上一个includeif部分来处理特定的部分,在Windows上似乎可以工作。 - Lasse V. Karlsen
你不能将它全局定义为@fun.times,然后跟随includeIf,仅在适用时覆盖名称和电子邮件吗?“否则”将隐含在前面的全局设置中。实际上,这正是@Lasse上面建议的。 - joanis
下一个问题:当我重现你的场景时,我在 git config --list 中也获得了双倍凭证,但当我执行 git commit 时,它使用了正确的凭证。 对我来说,似乎后面的出现覆盖了前面的,即使 git config --list 仍然列出了它们两个。 - joanis
@joanis git log 显示的最后作者也是对我进行粗略测试的结果。鉴于存在多作者提交[1] [2],我不想让缓存的凭据“闲置”,并且希望它不会被一些不应该看到它的进程捡起来。 - Peter Vandivier
1
@PeterVandivier 尝试使用 git log --format=raw 命令来确认它是安全的:根据 git log --help 的说明,“raw” 格式会完整地显示提交对象中存储的所有提交信息。在我这边,当你重现了你的场景后,我只能在 work 文件夹下的测试提交中看到 “work” 身份。 - joanis
显示剩余3条评论
3个回答

4
git config --list --show-origin | grep user的输出是什么?你应该能看到配置定义的位置。

我想要自动配置一个默认的[user],并且在所有的仓库中都使用这个默认值。

在这种情况下,删除所有上述的用户配置,并在全局配置中设置一个条目。

# Use the `--global` to store it under your user account configuration
# and it will be used as the default for all of your projects unless you
# define it in your local `.git/config`

git config --global user.name <....>
git config --global user.email <....>

---- 
# For specific project use the `--local` flag (will be stored in your `.git/config`

git config --local user.name <....>
git config --local user.email <....>

1
使用 git config --local 每个仓库都是我试图通过条件全局配置避免的。+1,然而 - 我从来不知道 --show-origin 选项。使用此标志,实际上看起来本地设置 [user] 并没有像我希望/期望的那样“覆盖”默认的全局配置设置。也许我需要在 git 仓库中阅读一些属性优先级方面的内容。 - Peter Vandivier

2

如果您有幸能够将所有的存储库组织成一个或多个父文件夹,那么问题就可以避免,因为您可以为每个目录使用单独的includeIf指令。这对某些人可能很有效,但在最初尝试后,我最终确定我仍然更喜欢为整个系统设置默认用户和电子邮件,以供任何不在特定父目录中的存储库使用,主要是因为我倾向于在我的机器上的各个位置创建小型存储库。我希望情况不是这样的,但目前:

我认为对于您的问题,最好的答案是保持原样。

经过一些测试,我已经确定,在Git配置中具有重复条目不会引起任何问题,并且似乎最后一个条目会获胜。因此,只要您在includeIf指令之前放置默认值,当您在与includeIf匹配的存储库内部时,即使您可以看到重复的条目,也只会使用最后一个用户和电子邮件。这完全实现了您的目标,并且只有在查看时才会显得奇怪。

顺便提一下:问题的评论似乎证实了这个答案。不过在另一个评论中,您提到您担心某些进程可能会使用重复的作者数据来自动化提交消息中的Co-authored-by:文本。在我看来,您不必担心这个问题,因为查看创建提交的机器的配置以确定该信息是没有意义的。协同作者信息基本上必须是手动的,因为Git无法知道哪些提交需要它,或者在进行提交时与谁进行协作。


2
问题出在你指定gitdir的方式上,我也遇到过同样的问题,路径(完整或相对)应该以斜杠结尾。

你的写法是:gitdir:~/work/*

正确的写法如下:
[includeIf "gitdir:~/work/"]
    path = ~/work/.gitconfig

您可以进入该目录并检查是否生效:
cd ~/work
git config --list | grep user

干杯!


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