对基于远程克隆 URL 的 Git 配置使用不同的 user.email 和 user.name



我配置我的全局~/.gitconfig属性user.name,并像这样user.email

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

这是我想要用于处理个人项目、开源内容等的默认配置。

当我处理来自特定域(例如公司域(的项目时,我在克隆它时为每个存储库配置它,以便它使用不同的user.name/user.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(的存储库?

Git 2.13 的发布引入了一个名为条件包含的功能。在 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

旧答案

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

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

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

git config --global user.useconfigonly true

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

我发现自己处于同样的情况:意识到我在推送到非公司存储库后立即使用公司电子邮件进行提交......所以我写了一个小的 git-hook,你可能也会觉得有用:https://github.com/DrVanScott/git-clone-init

基于可配置的模式文件,它将初始化 user.email 并在 git 克隆上 user.name。

自 2.36.0 起,Git 现在通过远程 URL 支持此功能

~/.gitconfig 文件:

[includeIf "hasconfig:remote.*.url:git@github.com*/**"]
    path = .gitconfig-public
[includeIf "hasconfig:remote.*.url:git@ghe.corp.lol*/**"]
    path = .gitconfig-work

然后将您的自定义添加到上面引用的配置中。

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

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

参见提交 19e7fda (2019 年 3 月 26 日( 作者:Nguyễn Thái Ngọc Duy ( pclouds (.
(由Junio C Hamano -- gitster -- 在提交078b254中合并,2019年4月22日(

config:纠正includeIf模式中的"**"匹配

当前wildmatch()includeIf的 gitdir 模式的调用没有传递WM_PATHNAME标志.
如果没有这个标志,'*'的处理方式几乎与'**'相同(因为'*'也匹配斜杠(,但有一个例外:

'

/**/ ' 可以匹配单个斜杠.
模式 ' foo/**/bar ' 匹配 ' foo/bar "。

但是 '/*/',本质上是 wildmatch 引擎在没有WM_PATHNAME的情况下看到的,必须匹配两个斜杠(并且 '* ' 什么都不匹配><(。这意味着"foo/*/bar"无法匹配"foo/bar".
它只能匹配"foo//bar"。

这样做的结果是当前wildmatch()调用工作的大部分直到用户依赖于"/**/"匹配无路径组件的时间.
而且"*"匹配斜杠,而不应该,但人们可能还没有注意到这一点。修复很简单。

<小时 />

在 Git 2.36(2022 年第 2 季度(中,您还有 git 配置hasconfig:remote.*.url: .

这意味着,使用"[includeIf <condition>]"的配置文件的条件包含机制已经学会了根据存储库与之交互的远程存储库的URL做出决定。

; include only if a remote with the given URL exists (note
; that such a URL may be provided later in a file or in a
; file read after this file is read, as seen in this example)
[includeIf "hasconfig:remote.*.url:https://example.com/**"]
    path = foo.inc
[remote "origin"]
    url = https://example.com/git

相关内容

最新更新