根据远程克隆URL为Git config使用不同的user.email和user.name

根据远程克隆URL为Git config使用不同的user.email和user.name,git,Git,我将全局~/.gitconfig属性user.name和user.email配置如下: git config --global user.email "mkobit@example.com" git config --global user.name "mkobit" 这是我在处理个人项目、开放源代码等工作时想要的默认配置 当我从特定域(例如公司域)处理项目时,我会在克隆它时为每个存储库配置它,以便它使用不同的用户。name/用户。email: git clone ssh://git@gi

我将全局
~/.gitconfig
属性
user.name
user.email
配置如下:

git config --global user.email "mkobit@example.com" 
git config --global user.name "mkobit"

这是我在处理个人项目、开放源代码等工作时想要的默认配置

当我从特定域(例如公司域)处理项目时,我会在克隆它时为每个存储库配置它,以便它使用不同的
用户。name
/
用户。email

git clone ssh://git@git.mycorp.com:1234/groupA/projectA.git
cd projectA
git config user.email "mkobit@mycorp.com"
git config user.name "m.kobit"
一个不错的选择是为克隆这类存储库设置别名:

git config --global alias.clonecorp 'clone \ 
        -c user.name="m.kobit" -c user.email="mkobit@mycorp.com"'
git clonecorp ssh://git@git.mycorp.com:1234/groupA/projectA.git
这两种方法都很容易出错,因为它们都依赖于我的聪明和遵循正确的步骤。证据表明,这几乎可以保证我会在某个时候搞砸

是否有一种方法可以配置Git,从而以某种方式配置来自某个域(本例中的
mycorp.com
)的存储库

的发行版引入了一种称为条件包含的功能。在2.13中,唯一受支持的配置是文件系统路径。在这种情况下很容易使用,因为我已经在分离它们了

发行说明中提供的示例如下:

您可以在主目录的
~/.gitconfig
文件中配置两个条件包含:

[includeIf "gitdir:~/work/"]
    path = .gitconfig-work
[includeIf "gitdir:~/play/"]
    path = .gitconfig-play
现在,您可以将任何想要的选项放入这些文件中:

$ cat ~/.gitconfig-work
[user]
name = Serious Q. Programmer
email = serious.programmer@business.example.com

$ cat ~/.gitconfig-play
[user]
name = Random J. Hacker
email = rmsfan1979@example.com

旧答案

在中,添加了一个全局配置
user.useconfigonly
,该配置坚持用户在提交前设置其
user.email
user.name
。以下是Github链接的博客文章中的相关文本:

但是,如果您想让Git为您的开源项目使用一个电子邮件地址,为您的工作项目使用另一个电子邮件地址,那么您无疑犯了一个错误:没有在该存储库中首先设置电子邮件地址,就提交到新的Git存储库。在这种情况下,Git会发出警告,但它仍然会使用从本地系统主机名猜出的电子邮件地址创建提交。如果你想为不同的项目做一些复杂的事情,比如不同的地址,这几乎肯定不是你想要的

现在,您可以告诉Git不要猜测,而是坚持在允许您提交之前显式设置user.name和user.email:

git config --global user.useconfigonly true

这并不能解决基于某些克隆URL的自动配置问题,但通过在开始时强制进行配置,确实使该过程不那么容易出错。

我发现自己也遇到了同样的情况:意识到在推送到非公司存储库之后,我立即使用公司电子邮件进行提交。。。因此,我编写了一个小git钩子,您可能会发现它也很有用:

基于一个可配置的模式文件,它将在git clone上初始化user.email和user.name

当我从特定域(例如公司域)处理项目时,我会在克隆它时为每个存储库配置它

如果您的条件包括配置
IncludeIf
使用模式,请确保使用Git 2.22(2019年第2季度):

参见作者(2019年3月26日)
(于2019年4月22日合并)

config
:更正
模式中的“
**
”匹配 当前的
wildmatch()
调用
includeIf
的gitdir模式不可用 传递
WM_路径名
标志。
如果没有此标志,“
*
”的处理方式与“
***
”几乎相同(因为“
*
”也与斜杠匹配),但有一个例外:

/**/
”可以匹配单个斜杠。
模式“
foo/**/bar
”与“
foo/bar
”匹配

但是,“
/*/
”,这基本上是wildmatch引擎在没有
WM_PATHNAME
的情况下看到的,必须匹配两个斜杠(并且“
*
”不匹配任何内容)。
这意味着“
foo/*/bar
”不能匹配“
foo/bar
”。
它只能与“
foo//bar
”匹配

其结果是当前的
wildmatch()
调用在大多数情况下都有效 用户依赖于“
/**/
”匹配的无路径组件之前的时间。
而且“
*
”匹配斜杠,虽然它不应该匹配斜杠,但人们可能会这样做 我还没注意到这一点。解决办法很简单


我一直在寻找完全相同的东西。真让人失望。尤其是在开发或自动生成环境中维护同一repo的多个副本或定期删除/重新克隆时。类似于管理不同ssh_ID的东西就可以了。谢谢!我想在这里补充一点,在以下条件中使用尾随斜杠非常重要:
~/work/
。您可以通过转到子文件夹中的repo并运行
git config user.name
来验证它的设置是否正确吗?尝试访问时无法获取值。