不同项目可以有不同的Git配置吗?

650

.gitconfig 通常存储在 user.home 目录中。

我在为公司A和公司B的项目工作时使用不同的身份(主要是姓名/电子邮件)。如何使用两个不同的Git配置,以便我的提交不会使用我的姓名/电子邮件?

15个回答

591

自 Git 版本 2.13 起,Git 支持条件配置包含。在此示例中,我们将 Company A 的存储库克隆到 ~/company_a 目录中,将 Company B 的存储库克隆到 ~/company_b 中。

在您的 .gitconfig 文件末尾,您可以添加以下内容:

[includeIf "gitdir:~/company_a/"]
  path = .gitconfig-company_a
[includeIf "gitdir:~/company_b/"]
  path = .gitconfig-company_b

.gitconfig-company_a 的示例内容(如果可以使用全局ssh密钥,则可以省略[core]部分):

[user]
name = John Smith
email = john.smith@companya.net

[core]
sshCommand = ssh -i ~/.ssh/id_rsa_companya

.gitconfig-company_b的示例内容:

[user]
name = John Smith
email = js@companyb.com

[core]
sshCommand = ssh -i ~/.ssh/id_rsa_companyb

2
很高兴看到这个功能已经添加到2.13版本中。我已经使用https://github.com/bddenhartog/git-profiles有一段时间了,但无法在Tower上使用它。 - adrum
5
includeIf有些棘手,请参见:https://dev59.com/sFcP5IYBdhLWcg3wu8a1#44117413 - rouble
2
@JosephLust 你需要安装 git >= 2.13 *(Ubuntu 16.04 自带的 git 版本为 2.7)*。通过 Git PPA 获取最新版本的 git,就可以正常使用了 :) - Cas
7
请注意,gitdir文件夹必须以斜杠(/)结尾,否则 git 将会忽略 ignoreIf 配置(实际上会导致结果为 false)。 - tukusejssirs
23
请注意,目录特定的配置仅在作为子目录的存储库内才会生效(例如 ~/company_a/repo_1)。如果您位于非存储库目录(如 ~/company_a)并运行 git config user.email,您仍将获得全局电子邮件地址。不要让这使您困惑。 - ADTC
显示剩余4条评论

556

git config有三个级别:项目级别、全局级别和系统级别。

  • 项目级别:项目配置仅适用于当前项目,并存储在项目目录下的.git/config中。
  • 全局级别:全局配置适用于当前用户的所有项目,并存储在~/.gitconfig中。
  • 系统级别:系统配置适用于所有用户/项目,并存储在/etc/gitconfig中。

要创建一个特定于项目的配置,您必须在项目目录下执行此操作:

$ git config user.name "John Doe" 

创建全局配置:

$ git config --global user.name "John Doe"
创建系统配置:
$ git config --system user.name "John Doe" 

正如您所猜测的那样,项目优先级高于全局,全局优先级高于系统。

注意:项目配置仅适用于此特定存储库的一个副本/克隆,并且如果从远程重新克隆干净的存储库,则需要重新应用它。它会更改一个本地文件,而不会使用提交/推送发送到远程。


153
有没有可能创建一些“目录”配置?我在家里做一些工作,有工作项目和自己的文件夹。因此,我有包含 git 存储库的 ~/job 和 ~/my 文件夹,并希望为它们下面的项目设置不同的配置。例如,job/project1 使用 job/.gitconfig 配置。 - MainActivity
7
@Serge,你是否想过是否可以创建目录级别的配置?我现在也遇到了同样的问题。 - Questioning
2
我将整个系统配置设置为个人数据,并编写了一个Bash脚本,以便在一个命令中将作业数据设置为特定的项目配置。 - MainActivity
3
作为补充说明:只需输入git config user.namegit config user.email即可查看Git在当前仓库中使用的用户名或电子邮件。 - Abhishek Divekar
6
你们试过这个吗?对我有用。https://dev59.com/0moy5IYBdhLWcg3wD53G#43884702 - Wit
显示剩余5条评论

382

一个特定的仓库副本中的 .git/config 文件只是针对该副本本地的。在那里放置的任何设置只会影响该项目的操作。

(默认情况下,git config 修改的是 .git/config,而不是 ~/.gitconfig,只有使用 --global 才会修改后者。)


100

感谢 @crea1

一个小变体:

正如在https://git-scm.com/docs/git-config#_includes上所写的:

如果模式以 / 结尾,则会自动添加 **。例如,模式 foo/ 变为 foo/**。换句话说,它递归地匹配 foo 和其内部所有内容。

所以在我的情况下,我使用
~/.gitconfig :

[user] # as default, personal needs
    email = myalias@personal-domain.fr
    name = bcag2
[includeIf "gitdir:~/workspace/"] # job needs, like workspace/* so all included projects
    path = .gitconfig-job

# all others section: core, alias, log…

如果项目目录在我的~/wokspace/中,则默认用户设置将替换为
~/.gitconfig-job

所以,如果项目目录在我的~/wokspace/文件夹中,默认的用户设置会被替换为~/.gitconfig-job
[user]
name = John Smith
email = js@company.com

完成了这个操作,现在正确的用户名和电子邮件已设置在不同的目录中。当我执行 git config user.name / git config user.email 时,可以得到正确的详细信息。但是当我在个人仓库中进行评论时,它总是选择全局官方用户名和电子邮件。 - Bhupendra
@Bhupendra 在我的示例中,.gitconfig和.gitconfig-job在我的主目录中,而不是项目目录中。你需要超过两个吗?你是否在你的主目录中创建了一个.gitconfig-alternativ,就像我示例中的.gitconfig-job一样,有3行内容。 - bcag2
@bcag2 我也按照上面给出的示例进行了操作。我有两个配置文件,一个是默认的工作配置文件,另一个类似于gitconfig-job的个人配置文件。当我在个人目录中时,运行 git config user.name 命令可以得到正确的用户名,但是在提交代码时它却使用了默认的配置文件,而我需要使用个人配置文件。 - swapnil2993
@swapnil2993 首先我认为这可能是路径问题,但如果 git config user.name 返回正确的用户名,那应该没问题了。你使用的是 GNU/Linux 还是其他操作系统? - bcag2
@bcag2问题已解决。只是更正了路径。但是git config user.name返回正确的值很奇怪。感谢您的回答。 - swapnil2993
1
注意:如果您需要文件路径不区分大小写,请将 gitdir 替换为 gitdir/i。示例:[includeIf "gitdir/i:~/workspace/"] - mskolnick

33

具体来说,您还可以使用--local选项来使用当前存储库配置文件

git config --local user.name "John Doe" 

正如@SherylHohman所提到的,使用以下方式在您的编辑器中打开本地文件:

git config --local --edit

1
如果你执行 git config --local --edit 命令,它会为你创建/打开本地文件,以便你可以直接进行编辑。这对我来说非常重要,因为由于某种未知的原因,无论是 VSCode 还是我的 XYPlorer 文件浏览器都不会显示我的 .git 文件夹(尽管其他点文件和系统文件都显示出来,而且传统上,如果我想要它显示我的 .git 文件夹,我的文件浏览器也会显示它)。对于我的情况,直接编辑文件比通过命令行添加多个选项要容易得多。 - SherylHohman

19

另一种方法是使用direnv,并将配置文件按目录分开。例如:

.
├── companyA
│  ├── .envrc
│  └── .gitconfig
├── companyB
│  ├── .envrc
│  └── .gitconfig
└── personal
   ├── .envrc
   └── .gitconfig

每个.envrc文件应该包含类似于以下内容:

export GIT_CONFIG_GLOBAL=$(pwd)/.gitconfig

.gitconfig是具有所需值的通常gitconfig。

这就是我在自定义的.gitconfig文件中实际拥有的内容:

[user]
    email = my.name@company.com

[include]
    path = ~/.gitconfig

这里只覆盖了 user.email,其他配置都来自默认的 ~/.gitconfig


2
这需要 git 2.3.2+ https://lore.kernel.org/lkml/xmqqa6o3xj2e.fsf@gitster.g/T/#u - Fangxing

17

我正在以下方式为我的电子邮件而努力:

git config --global alias.hobbyprofile 'config user.email "me@example.com"'

然后,当我克隆一个新的工作项目时,我只需要运行git hobbyprofile,它就会被配置为使用该电子邮件。


如何更改用户名呢? - undefined

13
您还可以将环境变量 GIT_CONFIG 指向一个文件,git config 将使用该文件。使用 GIT_CONFIG=~/.gitconfig-A git config key value 命令可操作指定的文件。

3
使用一些巧妙的 shell 技巧,这个方法很酷,可以设置让 Git 在向上遍历目录树时选择第一个 .gitconfig 文件来配置当前仓库。谢谢! - ecmanaut
1
你有这个能做到这个的shell魔法的链接吗?听起来很有用! - pchiusano
1
@pchiusano 这是一个基本版本的fish脚本 https://github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/config.fish#L14 - ctrlc-root
感谢您提供一个简单的解决方案,只需要更改一个环境变量。 - Noah Sussman
现在它只影响git config命令。https://github.com/git/git/blob/master/Documentation/RelNotes/1.6.0.txt#L41 - foray1010
对于Git v2.32.0及更高版本,请使用GIT_CONFIG_GLOBAL。例如:GIT_CONFIG_GLOBAL=~/.gitconfig-another git commit -m "foo" - Abdull

4
您可以通过更改特定于存储库的配置文件(即 /path/to/repo/.git/config)来自定义项目的Git配置。顺便说一下, git config 默认情况下会写入此文件。
cd /path/to/repo
git config user.name 'John Doe'  # sets user.name locally for the repo

我喜欢为不同的项目创建单独的配置文件(例如在~/.gitconfig.d/中),然后将它们包含到版本库的配置文件中:

cd /path/to/repo
git config include.path '~/.gitconfig.d/myproject.conf'

如果您需要在属于一个项目的多个存储库中使用相同的选项集,那么这样做效果很好。您还可以设置shell别名或自定义Git命令来操作配置文件。


2

在Github配置中添加多个SSH密钥

自2021年8月13日起,git不再支持HTTPs身份验证方法,因此我认为需要更新此答案。

按照以下步骤操作:

  • 删除存储在目录~/.ssh/中的Git的所有SSH密钥(公钥和私钥)。
  • 创建新的SSH密钥:
ssh-keygen -t rsa -b 4096 -C "account1@gmail.com"
ssh-keygen -t rsa -b 4096 -C "account2@gmail.com"

当要求文件名时,分别为account1和account2指定默认值~/.ssh/id_rsa~/.ssh/id_rsa_acc2

  • 启动ssh-agent并添加account1和account2的私钥:
eval `ssh-agent`
ssh-add -k ~/.ssh/id_rsa
ssh-add -k ~/.ssh/id_rsa_acc2

确认密钥已通过命令ssh-add -l添加

  • 复制账户1和账户2的公钥并将其添加到您的GitHub帐户。 命令:cat ~/.ssh/id_rsa.pub | pbcopy(检查是否已复制:pbpaste

  • 将账户1的用户名和用户电子邮件设置为全局GitHub配置:

git config --global user.name "acc1_username"
git config --global user.email "account1@gmail.com"
  • 创建一个名为~/.ssh/config的文件,并添加以下配置:
# account1 github
Host github.com
HostName github.com
User git
AddKeysToAgent yes
IdentityFile ~/.ssh/id_rsa

# account2 github
Host github.com-acc2
HostName github.com
User git
AddKeysToAgent yes
IdentityFile ~/.ssh/id_rsa_acc2
  • 为项目设置GitHub账户2,在项目根目录中设置用户名和电子邮件:
git config user.name "acc2_username"
git config user.email "account2@gmail.com"
  • 现在可以使用GitHub仓库的SSH链接克隆或添加源:
# for account1 repo
git remote set-url origin git@github.com:acc1_username/reponame.git

# for account2 repo
git clone git@github.com-acc2:acc2_username/reponame.git

如有任何疑问,请随时添加评论。


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