是否可能对不同的项目使用不同的 Git 配置?

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

我使用不同的身份为 A 公司的项目工作,为 B 公司的项目工作(主要是名称/电子邮件)。我怎样才能有两种不同的 Git 配置,使我的签入不与名称/电子邮件一起?

251748 次浏览

存储库的特定克隆中的.git/config文件是该克隆的本地文件。放置在那里的任何设置只会影响该特定项目的操作。

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

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

我和你处境相同。我写了一个bash脚本来管理它们。 # EYZ0 < / p >
#!/bin/bash


# setgit
#
# Script to manage multiple global gitconfigs
#
# To save your current .gitconfig to .gitconfig-this just run:
# setgit -s this
#
# To load .gitconfig-this to .gitconfig it run:
# setgit -f this
#
#
#
# Author: Jeffrey Stone <thejeffreystone@gmail.com>


usage(){
echo "$(basename $0) [-h] [-f name]"
echo ""
echo "where:"
echo " -h  Show Help Text"
echo " -f  Load the .gitconfig file based on option passed"
echo ""
exit 1
}


if [ $# -lt 1 ]
then
usage
exit
fi


while getopts ':hf:' option; do
case "$option" in
h) usage
exit
;;
f) echo "Loading .gitconfig from .gitconfig-$OPTARG"
cat ~/.gitconfig-$OPTARG > ~/.gitconfig
;;
*) printf "illegal option: '%s'\n" "$OPTARG" >&2
echo "$usage" >&2
exit 1
;;
esac
done

git配置有3个级别;项目、全局、系统。

  • 项目:项目配置仅对当前项目可用,并存储在项目目录下的.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"

正如你可能猜到的,项目覆盖全局和全局覆盖系统。

注意:项目配置是本地的,只针对这个特定的repo的一个特定副本/克隆,如果从远程重新克隆了这个repo,则需要重新应用。它修改一个not的本地文件通过提交/推送发送到远程

我在我的电子邮件中这样做的方式如下:

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

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

从git 2.13版本开始,git支持条件配置包括。在这个例子中,我们克隆了公司A在~/company_a目录下的回购,以及公司B在~/company_b目录下的回购。

.gitconfig中,你可以这样写。

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

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

[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

为了显式,你也可以使用--local来使用当前存储库配置文件:

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

或者像@SherylHohman提到的那样,使用以下方法在编辑器中打开本地文件:

git config --local --edit

由于@crea1

一个小变种:

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

如果模式以/结尾,则会自动添加**。例如,模式foo/变成了foo/**。换句话说,它递归地匹配foo和里面的所有东西。

所以在我的例子中,我使用
~ /。gitconfig < / em >:

[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 < / em >:

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

我有一个错误时,试图git stash我的本地更改。git的错误提示是“请告诉我您是谁”,然后告诉我“运行git config --global user.email "you@example.comgit config --global user.name "Your name"来设置您帐户的默认身份”。但是,您必须省略——全球来仅在当前存储库中设置标识。

另一种方法是使用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

您可以通过更改特定于存储库的配置文件(例如/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命令来操作概要文件。

遵循以下步骤:

  1. 从系统中找到。gitconfig

    # EYZ0“C: \用户$ {USER_NAME} .gitconfig"

    # EYZ0“/ usr /地方/ git / etc / gitconfig"

  2. 打开.gitconfig文件,并根据您的条件添加以下行

     [includeIf "gitdir:D:\ORG-A-PROJECTS\"]
    
    
    [user]
    
    
    name = John Smith
    
    
    email = js@organizationx.com [includeIf "gitdir:~/organization_b/"]
    
    
    [user]
    
    
    name = John Doe
    
    
    email = jd@organizationy.com
    

使用Github配置添加多个SSH密钥

2021年8月13日之后,git不支持HTTPs认证方法,所以我认为这个答案需要更新。

遵循以下步骤:

  • 删除所有SSH密钥(public &private)存储在~/.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确认添加密钥

  • 复制account1和account2的公钥,并将其添加到您的github帐户。命令:cat ~/.ssh/id_rsa.pub | pbcopy(检查是否复制:pbpaste

  • 设置account1的用户名和用户邮箱为全局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 account2为一个项目设置用户名&项目根目录下的项目级电子邮件:
git config user.name "acc2_username"
git config user.email "account2@gmail.com"
  • 现在通过使用GitHub repo的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

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

找到了一个非常有用的shell脚本,覆盖了ssh密钥生成的所有过程,并一次又一次地输入长命令

注意:这仅适用于ZSh用户

https://github.com/tw-yshuang/Git_SSH-Account_Switch