是否可以为不同的项目使用不同的Git配置?


313

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

我使用其他身份为公司A和公司B(主要是名称/电子邮件)从事其他项目。我如何有两种不同的Git配置,以便我的签到不带有名称/电子邮件?

Answers:


263

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

(默认情况下,仅git config修改.git/config,而不是修改。)~/.gitconfig--global


因此是否会针对仓库本身修改配置文件中的配置文件(例如更改[user] email = ...块),将覆盖全局文件~/.gitconfig-这仅适用于您的用户?
dcsan

281

git config分为3个级别;项目,全局和系统。

  • project:项目配置仅适用于当前项目,并存储在项目目录中的.git / config中。
  • global:全局配置可用于当前用户的所有项目,并存储在〜/ .gitconfig中。
  • system:系统配置可用于所有用户/项目,并存储在/ etc / gitconfig中。

创建项目特定的配置,您必须在项目目录下执行此配置:

$ git config user.name "John Doe" 

创建一个全局配置:

$ git config --global user.name "John Doe"

创建系统配置:

$ git config --system user.name "John Doe" 

您可能会猜到,项目会覆盖全局和全局覆盖系统。


68
有可能进行一些“目录”配置吗?我在家做一些工作,并得到了包含工作项目和我自己的文件夹。所以我有git repos文件夹〜/ job和〜/ my,并希望它们下的项目有不同的配置。例如job / project1具有job / .gitconfig的配置。
Serge

2
@Serge您是否曾经想过是否可以创建目录级别的配置?我现在有同样的问题。
质疑

2
否,我将整个系统配置设置为个人数据,并制作bash脚本以通过一个命令将作业数据设置为某些项目配置。
Serge

1
作为附录:just git config user.namegit config user.email将为您显示Git用于当前存储库的名称或电子邮件。
Abhishek Divekar '19

1
我最终为zsh完成了此操作:gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106,希望对您有所帮助。
pgarciacamou

219

从git版本2.13开始,git支持条件配置include。在此示例中,我们在~/company_a目录中克隆了公司A的存储库,并在中克隆了公司B的存储库~/company_b

在你的.gitconfig,你可以把这样的事情。

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

.gitconfig-company_a的示例内容

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

.gitconfig-company_b的示例内容

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

1
很高兴看到此功能已在2.13版中添加。我使用github.com/bddenhartog/git-profiles已有一段时间了,但是无法使其与Tower合作。
adrum

4
includeIf有点挑剔,请参阅:stackoverflow.com/questions/43919191/…–
卢布,

您链接到的文档页面没有提及此...实际上,搜索includeIf不会在文档中产生任何结果
Thomas Levesque

1
@ThomasLevesque太奇怪了。我敢肯定它之前说过些什么。您可以在变更日志中找到它 github.com/git/git/blob/master/Documentation/RelNotes/中也可以在kernel.org/pub/software/scm/git/docs/git-config.html中找到
crea1

2
@JosephLust您需要安装git> = 2.13 (Ubuntu 16.04具有git 2.7)。通过Git PPA获取最新版本的git ,它将起作用:)
Cas

23

谢谢@ 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…

因此,如果项目目录位于my中~/wokspace/,则默认用户设置将替换为
〜/ .gitconfig-w

[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我也遵循上面给出的相同示例。我有2个配置工作默认配置,个人配置类似于gitconfig-job。当我在个人目录中时,在git config上,user.name为我提供了正确的名称,但是对于推送提交,它将使用默认名称,而我需要个人名称。
swapnil2993

@ swapnil2993首先,我认为是路径问题,但是如果git config user.name返回正确的,应该没问题。您是在GNU / Linux还是其他操作系统下?
bcag2

@ bcag2解决了此问题。刚刚更正了路径。但是git config user.name返回正确的值很奇怪。感谢您的回答。
swapnil2993

13

明确地说,您还--local可以使用当前存储库配置文件

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

12

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


2
凉; 加上一些巧妙的外壳魔术,可以用来设置东西,所以git会在向上遍历当前回购目录树时选择它找到的第一个.gitconfig。谢谢!
ecmanaut

1
您是否有指向此外壳魔术的链接?听起来很有用!
pchiusano 2013年

1
@pchiusano这里是它在鱼初级版本github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/...
CTRLC根

感谢您提供仅需要更改一个环境变量的简单解决方案。
诺亚·萨斯曼


12

我通过以下方式为我的电子邮件执行此操作:

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

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


3

另一种方法是使用direnv并在每个目录中分隔配置文件。例如:

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

每个.envrc都应包含以下内容:

export GIT_CONFIG=$(pwd)/.gitconfig

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


2

您可以通过更改存储库特定的配置文件(即/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'

如果您需要在属于单个项目的多个存储库中使用相同的选项集,则此方法效果很好。您还可以设置外壳别名或自定义的Git命令来操作配置文件。


0

我在同一条船上。我写了一些bash脚本来管理它们。 https://github.com/thejeffreystone/setgit

#!/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

您的脚本在Bash中,而在Github上您具有Python版本。也-s不会在您的Bash脚本中处理。
Vadim Kotov '18

0

尝试进行git stash本地更改时出现错误。来自git的错误显示“请告诉我您是谁”,然后告诉我“运行git config --global user.email "you@example.comgit config --global user.name "Your name"设置您帐户的默认身份”。但是,您必须省略--global才能仅在当前存储库中设置身份。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.