프로젝트마다 다른 Git 구성을 가질 수 있습니까?


315

.gitconfig일반적으로 user.home디렉토리에 저장됩니다 .

나는 다른 정체성을 사용하여 회사 A와 회사 B를위한 프로젝트 (주로 이름 / 이메일)를 위해 일합니다. 체크인에 이름 / 이메일이 포함되지 않도록 두 가지 다른 Git 구성을 어떻게 가질 수 있습니까?

답변:


264

.git/config저장소의 특정 복제본의 파일은 해당 복제에 대해 로컬입니다. 배치 된 모든 설정은 해당 특정 프로젝트의 작업에만 영향을줍니다.

(기본적으로, git config수정은 .git/config하지 ~/.gitconfig-에서만 --global수행이 후자를 수정합니다.)


따라서 repo 자체의 구성에서 구성 파일을 수정하면 (예 : [user] email = ...블록 변경) 전역을 재정의합니다. ~/.gitconfig이는 사용자에게만 해당됩니까?
dcsan

283

git config에는 3 가지 레벨이 있습니다; 프로젝트, 글로벌 및 시스템.

  • 계획 : 프로젝트 설정은 현재 프로젝트에서만 사용 가능하며 프로젝트 디렉토리의 .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" 

그리고 짐작할 수 있듯이 프로젝트는 전역 및 전역 재정의 시스템을 재정의합니다.


69
"디렉토리"구성을 만들 가능성이 있습니까? 나는 집에서 몇 가지 일을하고 작업 프로젝트가 있고 자신의 폴더가 있습니다. 그래서 ~ / job 및 ~ / my 폴더에 git repos가 있고 그 아래 프로젝트에 대해 다른 구성을 원합니다. 예를 들어 job / project1에는 job / .gitconfig의 구성이 있습니다.
18:41에

2
@Serge 디렉토리 레벨 설정을 만들 수 있는지 알아 본 적이 있습니까? 나는 지금 같은 문제가 있습니다.
Questioning

2
아니오 전체 시스템 구성을 개인 데이터로 설정하고 bash 스크립트를 사용하여 하나의 명령으로 작업 데이터를 특정 프로젝트 구성으로 설정합니다.
서지

1
부록으로 : Git이 현재 리포지토리에 사용할 이름 또는 전자 메일을 표시 git config user.name하거나 git config user.email표시합니다.
Abhishek Divekar

1
나는이 일을 결국 zsh을 위해 : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106을 , 나는이 사람을 도움이되기를 바랍니다.
pgarciacamou

219

git 버전 2.13부터 git은 조건부 구성 include를 지원합니다 . 이 예에서는 회사 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의 내용 예

[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
@Joseph git> = 2.13 을 설치해야합니다 (Ubuntu 16.04에는 git 2.7이 있습니다) . Git PPA 를 통해 최신 버전의 git을 얻으면 작동합니다 :)
Cas

24

감사합니다 @ 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을 수행하면 정확한 세부 정보를 얻습니다. 나는 개인의 repo에 대해 언급 할 때, 그것은 항상 글로벌 공식 이름 이메일을 집어
Bhupendra

@Bhupendra 내 샘플에서 .gitconfig 및 .gitconfig-job은 프로젝트 디렉토리가 아닌 내 집에 있습니다. 둘 이상이 필요합니까? 샘플에서 .gitconfig-job과 같이 홈 디렉토리에 .gitconfig-alternativ를 3 줄로 작성하십시오.
bcag2

@ bcag2 나는 위에 주어진 동일한 예제를 따랐다. 2 개의 구성이 기본 구성으로 작동하고 gitconfig-job과 유사합니다. 개인 디렉토리에있을 때 git config user.name에서 올바른 이름을 제공하지만 커밋을 푸시하려면 기본 이름이 필요하지만 개인 이름이 필요합니다.
swapnil2993

@ swapnil2993 먼저 경로 문제를 생각하지만 git config user.name올바른 것을 반환 하면 괜찮습니다. GNU / Linux 또는 다른 OS를 사용하고 있습니까?
bcag2

@ bcag2 문제를 해결했습니다. 방금 경로를 수정했습니다. 그러나 올바른 값을 반환하는 git config user.name은 이상했습니다. 답변 해주셔서 감사합니다.
swapnil2993

14

명시 적으로 현재 저장소 구성 파일--local 을 사용 하는 데 사용할 수도 있습니다 .

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

12

환경 변수 가 사용해야 GIT_CONFIG하는 파일을 가리킬 수도 git config있습니다. 으로 GIT_CONFIG=~/.gitconfig-A git config key value지정된 파일이 조작됩니다.


2
멋있는; 약간의 영리한 쉘 마법으로 이것을 사용하여 git이 현재 저장소보다 dir 트리를 횡단 할 때 찾은 첫 번째 .gitconfig를 선택하도록 설정할 수 있습니다. 감사!
ecmanaut

1
이 작업을 수행하는이 쉘 매직에 대한 링크가 있습니까? 유용하게 들린다!
pchiusano

1
@pchiusano 여기 물고기 그것의 기본적인 버전의 github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/...은
ctrlc 루트

하나의 환경 변수 만 변경하면되는 간단한 솔루션에 감사합니다.
노아 서스 먼

git config 명령에만 영향을 미칩니다. github.com/git/git/blob/master/Documentation/RelNotes/…
foray1010

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

저장소 별 구성 파일 (예 :)을 변경하여 프로젝트의 Git 구성을 사용자 정의 할 수 있습니다 /path/to/repo/.git/config. BTW, 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 버전이 있습니다. 또한 -sBash 스크립트에서 처리되지 않습니다.
Vadim Kotov

0

git stash로컬 변경을 시도 할 때 오류가 발생했습니다 . git의 오류는 "내가 누구인지 알려주십시오"라고 말한 다음 " 계정의 기본 ID를 실행 git config --global user.email "you@example.com하고 git config --global user.name "Your name"설정하도록 요청했습니다." 그러나 현재 저장소에서만 ID를 설정하려면 --global생략 해야 합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.