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

时间:2016-01-04 18:10:12

标签: git

我按照以下方式配置全局~/.gitconfig媒体资源user.nameuser.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)的存储库将以某种方式配置?

3 个答案:

答案 0 :(得分:9)

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的自动配置,但是通过在开始时强制配置确实使该过程不易出错。

答案 1 :(得分:1)

  

当我从特定域(例如公司域)从事项目时,我在克隆每个存储库时都会对其进行配置

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

请参见commit 19e7fdaNguyễn Thái Ngọc Duy (pclouds)(2019年3月26日)。
(由Junio C Hamano -- gitster --commit 078b254中合并,2019年4月22日)

  

config:以**模式正确匹配“ includeIf

     

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

'/**/'可以匹配一个斜杠。
  模式'foo/**/bar'与'foo/bar'相匹配。

     

但是'/*/'本质上就是没有WM_PATHNAME的通配符引擎看到的,它必须匹配两个斜杠(而'*'不匹配任何斜杠)。
  这意味着'foo/*/bar'无法匹配'foo/bar'。
  它只能匹配“ foo//bar”。

     

此操作的结果是当前wildmatch()调用在大多数情况下都有效   直到用户依赖'/**/'匹配任何路径组件的时间。
  并且'*'匹配斜杠,虽然不应该,但人们可能   还没有注意到这一点。解决方法很简单。

答案 2 :(得分:0)

我发现自己处于同样的境地:意识到我在推送到非公司存储库之后就使用了我的公司电子邮件进行提交......所以我写了一个小git-hook,你可能会发现它很有用:{{ 3}}

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