.gitconfig에서 여러 사용자를 직접 지정할 수 있습니까?


754

내 Github repos에 사용하려는 ~/.gitconfig개인 이메일 주소 [user]를에 표시합니다.

그러나 최근에는 작업을 위해 git을 사용하기 시작했습니다. 우리 회사의 git repo를 사용하면 커밋 할 수 있지만 새로운 변경 세트에 대한 알림을 보내면 내 이메일 주소를 인식하지 못하기 때문에 Anonymous에서 온 것입니다 .gitconfig. 적어도 내 이론입니다.

에 여러 [user]정의 를 지정할 수 .gitconfig있습니까? 아니면 .gitconfig특정 디렉토리 의 기본값을 재정의하는 다른 방법이 있습니까? 내 경우에는 모든 작업 코드를 확인 합니다. 해당 디렉토리 (및 해당 하위 디렉토리)에 대해서만를 ~/worksrc/지정하는 방법이 .gitconfig있습니까?


git-config # FILES를 참조하십시오 .
Josh Lee

1
회사 서버가 그렇게 할 수 있다는 사실에 놀랐습니다. 커밋을 변경해야 작동합니다. 로컬 결제에 커밋하면 어떤 사용자 이름이 보입니까?
Alex Brown

1
@Alex : 중요한 부분을 잊어 버렸습니다. 커밋에서 아무것도 변경하지 않고 전자 메일 알림의 이름 일 수 있습니다.
Cascabel

1
git-hook을 사용하여이 반복 작업을 자동화 할 수 있습니다. github.com/DrVanScott/git-clone-init
Henning

1
이 답변을 받아주십시오 stackoverflow.com/a/43654115/482899를 . git 2.13 이후 최고의 솔루션입니다.
northtree

답변:


1016

전역 구성을 재정의하는 특정 사용자 / 이메일 주소를 사용하도록 개별 저장소를 구성 할 수 있습니다. 리포지토리의 루트에서

git config user.name "Your Name Here"
git config user.email your@email.com

반면 기본 사용자 / 이메일은 ~ / .gitconfig에서 구성됩니다.

git config --global user.name "Your Name Here"
git config --global user.email your@email.com

83
.git/config파일 에서 이러한 설정의 효과를 볼 수 있습니다
Abizern

21
수동으로 그 설정 파일을 편집 할 수 있습니다 git config --editgit config --global --edit. 그리고 Abizern의 주석 을 놓친 경우 저장소의 구성 파일은에 <repo-root>/.git/config있습니다.
Rory O'Kane

13
당신은해야 또한 해제 GIT_AUTHOR_EMAILGIT_COMMITTER_EMAIL 가 로컬 설정을 무시로 (그리고 * _NAME)
비주기

6
개별 저장소가 아닌 지정된 폴더의 모든 저장소에 대해이 작업을 수행하는 방법이 있습니까? 여기 내 질문을 참조하십시오 : stackoverflow.com/questions/21307793/…
scubbo

6
오늘 출시 된 최신 솔루션에 대해서는 아래의 답변을 참조하십시오 Git 2.13.
tejasbubane

490

자식 2.13 부터 새로 도입 된 조건부 포함을 사용하여이 문제를 해결할 수 있습니다 .

예를 들면 :

전역 설정 ~ / .gitconfig

[user]
    name = John Doe
    email = john@doe.tld

[includeIf "gitdir:~/work/"]
    path = ~/work/.gitconfig

작업 별 구성 ~ / work / .gitconfig

[user]
    email = john.doe@company.tld

48
이것은 git 2.13이 릴리스 된 가장 좋은 대답입니다.
tejasbubane

1
이 솔루션은 include 문에 지정된 디렉토리 내의 모든 하위 디렉토리에 대해 자체 .gitconfig 파일이 없다고 가정 할 때 작동합니까? 나는 그렇게 생각할 것이지만, 지금까지 테스트는 이것을 수행하지 않았다.
Gary

2
@Gary 예, 내 경험과 문서에 따르면 :“패턴이 /로 끝나면 **가 자동으로 추가됩니다. 예를 들어, 패턴 foo /는 foo / **가됩니다. 다시 말해, "foo"와 모든 것을 재귀 적으로 일치시킵니다. ","; $ HOME / to / group 내의 모든 리포지토리에 포함 [includeIf "gitdir : ~ / to / group /"]”
Tomáš Janoušek

6
gitdir는 지난 포함해야한다 '/'.
Chris Yim

5
git config --list다른 디렉토리에서 실행 하여 재귀 적으로 작동하는지 확인할 수 있습니다 . ~/work/자식 리포지토리가 포함 된 하위 디렉터리 에는 includeIf적용됩니다. 하위 디렉토리 ~/work/에는 git 저장소가 포함되어 includeIf있지 않으므로 실행되지 않습니다.
NZD

104

또는 로컬 .git/config파일에 다음 정보를 추가 할 수 있습니다

[user]  
    name = Your Name
    email = your.email@gmail.com

27
... @ discomurray가 권장하는 명령을 수행하는 수동 방법입니다.
user456584

1
리모컨 당 여러 줄을 추가 할 수 있습니까?
Abel Callejo

55

하나의 명령 github 계정 전환

이 솔루션은 단일 자식 별칭의 형태를 취합니다. 일단 실행되면 현재 프로젝트 사용자는 다른 계정에 연결됩니다

ssh 키 생성

ssh-keygen -t rsa -C "rinquin.arnaud@gmail.com" -f '/Users/arnaudrinquin/.ssh/id_rsa'

[...]

ssh-keygen -t rsa -C "arnaud.rinquin@wopata.com" -f '/Users/arnaudrinquin/.ssh/id_rsa_pro'

GitHub / Bitbucket 계정에 연결

  1. 기본 공개 키 복사 pbcopy < ~/.ssh/id_rsa.pub
  2. GitHub 계정에 로그인
  3. add SSH keygithub 페이지에 키를 붙여 넣습니다
  4. 다른 공개 키 복사 pbcopy < ~/.ssh/id_rsa_pro.pub
  5. 다른 모든 계정에 대해 2-4 단계 반복 및 조정

1 단계. 자동 ssh 키 전환.

ssh따라 특정 암호화 키를 사용하도록 보내도록 구성 할 수 있습니다 host. 좋은 점은 동일한 별칭을 여러 개 가질 수 있다는 것입니다hostname .

이 예제 ~/.ssh/config파일을보십시오 :

# Default GitHub
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa

# Professional github alias
Host github_pro
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_pro

자식 원격 구성

이제 변경하여 자식 리모컨에서 이러한 별칭을 사용할 수 있습니다 git@github.comgit@github_pro.

기존 프로젝트를 원격으로 변경하거나 (같은 것을 사용하여 git remote set-url origin git@github_pro:foo/bar.git) 복제 할 때 직접 조정할 수 있습니다.

git clone git@github.com:ArnaudRinquin/atom-zentabs.git

별명을 사용하면 다음과 같습니다.

git clone git@github_pro:ArnaudRinquin/atom-zentabs.git

2 단계. git user.email 변경

힘내 구성 설정은 전역 또는 프로젝트별로 가능합니다. 이 경우 프로젝트 당 설정을 원합니다. 변경하기가 매우 쉽습니다.

git config user.email 'arnaud.rinquin@wopata.com'

이것은 쉽지만 개발자에게는 오랜 시간이 걸립니다. 이를 위해 매우 간단한 git alias를 작성할 수 있습니다.

~/.gitconfig파일 에 추가하겠습니다 .

[user]
    name = Arnaud Rinquin
    email = rinquin.arnaud@gmail.com

...

[alias]
    setpromail = "config user.email 'arnaud.rinquin@wopata.com'"

그럼 우리가해야 할 일은 git setpromail 이 프로젝트에 대해서만 전자 메일을 변경하면됩니다.

3 단계. 하나의 명령 스위치를 사용 하시겠습니까?!

하나의 매개 변수가없는 명령으로 기본 계정에서 지정된 계정으로 전환하는 것이 좋지 않습니까? 확실히 가능합니다. 이 명령에는 두 단계가 있습니다.

  • 현재 프로젝트 리모컨을 선택한 별명으로 변경
  • 현재 프로젝트 사용자를 변경하십시오.

우리는 이미 두 번째 단계를위한 하나의 명령 솔루션을 가지고 있지만 첫 번째 단계는 더 어렵습니다. 하나의 명령 원격 호스트 변경

다음은 다른 git alias 명령의 형태로 솔루션을 제공합니다 ~/.gitconfig.

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"

이를 통해 한 호스트에서 다른 호스트 (별명)로 모든 원격을 변경할 수 있습니다. 예를보십시오 :

$ > git remote -v
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (push)

$ > git changeremotehost github.com github_pro

$ > git remote -v
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (push)

그들 모두를 결합

이제 두 명령을 하나로 결합하기 만하면됩니다. 이것은 매우 쉽습니다. 비트 버킷 호스트 스위칭도 어떻게 통합하는지 확인하십시오.

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"
  setpromail = "config user.email 'arnaud.rinquin@wopata.com'"
  gopro = !sh -c \"git changeremotehost github.com github_pro && git changeremotehost bitbucket.com bitbucket_pro && git setpromail\"

소스 링크-튜토리얼


고마워요. 이메일마다 여러 개의 저장소를 사용하여 setpromail별칭을 config --global대신 사용합니다 (다른 이메일 주소를 설정하기 위해 다른 별칭을 설정했습니다). 효과가있다!
michel-slm 2016 년

1
이 두 가지 계정의 경우 다른 gpg 키로 어떻게 서명 할 수 있습니까? 2x github 계정에 2x gpg 키가 있으며 다르게 서명하고 싶습니다. "git config --global user.signingkey xxxx"
hakkican

이 답변은 굉장합니다. 나는 다른 답변에서 무엇을 찾았다 고 생각했기 때문에 거의 읽지 않았습니다. 더 많은 공감대를 가질 가치가 있습니다. 추신. useConfigOnly = true다른 답변 과 결합하면 더 좋습니다 .
steinybot 2016 년

IdentityFile이 아니라 IdenfityFile입니다.
기독교

40

Orr Sella의 블로그 게시물 에서 영감을 얻은 후 ~/.git/templates/hooks로컬 리포지토리의 정보를 기반으로 특정 사용자 이름과 전자 메일 주소를 설정 하는 사전 커밋 후크 ( )를 작성했습니다 ./.git/config.

템플릿 디렉토리의 경로를 ~/.gitconfig:

[init]
    templatedir = ~/.git/templates

그런 다음 각각 git init또는 git clone해당 후크를 선택하고 다음 동안 사용자 데이터를 적용합니다 git commit. 이미 존재하는 리포지토리에 후크를 적용하려면 리포지토리 git init내부를 실행하여 다시 초기화하십시오.

여기에 내가 만든 고리가 있습니다 (여전히 연마가 필요합니다-제안은 환영합니다). 다음 중 하나로 저장하십시오

~/.git/templates/hooks/pre_commit

또는

~/.git/templates/hooks/post-checkout

실행 가능한지 확인하십시오. chmod +x ./post-checkout || chmod +x ./pre_commit

#!/usr/bin/env bash

# -------- USER CONFIG
# Patterns to match a repo's "remote.origin.url" - beginning portion of the hostname
git_remotes[0]="Github"
git_remotes[1]="Gitlab"

# Adjust names and e-mail addresses
local_id_0[0]="my_name_0"
local_id_0[1]="my_email_0"

local_id_1[0]="my_name_1"
local_id_1[1]="my_email_1"

local_fallback_id[0]="${local_id_0[0]}"
local_fallback_id[1]="${local_id_0[1]}"


# -------- FUNCTIONS
setIdentity()
{
    local current_id local_id

    current_id[0]="$(git config --get --local user.name)"
    current_id[1]="$(git config --get --local user.email)"

    local_id=("$@")

    if [[ "${current_id[0]}" == "${local_id[0]}" &&
          "${current_id[1]}" == "${local_id[1]}" ]]; then
        printf " Local identity is:\n"
        printf "»  User: %s\n»  Mail: %s\n\n" "${current_id[@]}"
    else
        printf "»  User: %s\n»  Mail: %s\n\n" "${local_id[@]}"
        git config --local user.name "${local_id[0]}"
        git config --local user.email "${local_id[1]}"
    fi

    return 0
}

# -------- IMPLEMENTATION
current_remote_url="$(git config --get --local remote.origin.url)"

if [[ "$current_remote_url" ]]; then

    for service in "${git_remotes[@]}"; do

        # Disable case sensitivity for regex matching
        shopt -s nocasematch

        if [[ "$current_remote_url" =~ $service ]]; then
            case "$service" in

                "${git_remotes[0]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[0]}"
                    setIdentity "${local_id_0[@]}"
                    exit 0
                    ;;

                "${git_remotes[1]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[1]}"
                    setIdentity "${local_id_1[@]}"
                    exit 0
                    ;;

                * )
                    printf "\n»  pre-commit hook: unknown error\n» Quitting.\n"
                    exit 1
                    ;;

            esac
        fi
    done
else
    printf "\n»» An Intermission\n»  No remote repository set. Using local fallback identity:\n"
    printf "»  User: %s\n»  Mail: %s\n\n" "${local_fallback_id[@]}"

    # Get the user's attention for a second
    sleep 1

    git config --local user.name "${local_fallback_id[0]}"
    git config --local user.email "${local_fallback_id[1]}"
fi

exit 0

편집하다:

그래서 파이썬에서 후크와 후크로 후크를 다시 작성했습니다. 또한 스크립트를 Git 명령 ( git passport) 으로 호출 할 수도 있습니다. 또한 ~/.gitpassport프롬프트에서 선택할 수있는 구성 파일 ( ) 내에 임의의 수의 ID를 정의 할 수 있습니다. github.com에서 프로젝트를 찾을 수 있습니다 : git-passport- Git 명령 및 후크는 여러 Git 계정 / 사용자 ID를 관리하기 위해 Python으로 작성되었습니다 .


1
이것은 깔끔하게 작동합니다. 그러나 이것이 커밋 후 포스트 체크 아웃 후크로 만들어서 나에게 더 효과적이었습니다. 내 제안이 있음을 언급하는이 답변을 향상시키기 위해 : 코드 조각이 필요 1. ~ / .git / 템플릿 / 후크 / 후 체크 아웃로 저장하고 지정된 액세스권 일 chmod +x post-checkout, 2 git_remotes값은 예를 들어, 전체 호스트 이름 부분을 시작 git@github.com, 3. local_id사용자는 각각의 이름과 이메일 주소로 값을 편집해야합니다.
Shantanu Kumar

@ShantanuKumar 귀하의 의견에 감사드립니다. 제안한대로 답변을 조정했습니다. 어쩌면 파이썬으로 곧 스크립트를 다시 작성할 것입니다.
Saucier

리모컨이없는 정규식 및 리포지토리에 대한 지원이 추가되었습니다. 모든 다운로드를 쉽게하려면 여기에 병합 하십시오 . 동일한 서비스에서 다른 프로젝트의 ID를 구별하기위한 정규식. 예를 들어 대화식 사전 커밋 트리거를 처리 할 수없는 git initIDE의 새 프로젝트 인 경우 기본 ID와 같은 원격리스 리포지토리를 지원하는 것이 좋습니다.eclipse
cfi

25

기본 이메일 주소를 원하지 않으면 ( github 사용자에게 이메일 주소 링크 ) 요청하도록 구성 할 수 있습니다. 이를 수행하는 방법은 사용하는 git 버전에 따라 다릅니다. 아래를 참조하십시오.

(의도 된) 단점은 모든 리포지토리마다 이메일 주소와 이름을 한 번 구성해야한다는 것입니다. 따라서 잊지 말아야합니다.

버전 <2.7.0

[user]
    name = Your name
    email = "(none)"

글로벌 구성 ~/.gitconfig으로는 댄 Aloni에 의해 코멘트에 명시된 오르 셀라의 블로그 게시물 . 저장소에서 첫 번째 커밋을 수행하려고하면 git이 멋진 메시지와 함께 실패합니다.

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '(none)')

이메일 주소가 로컬로 설정된 경우 이름은 글로벌 구성에서 가져옵니다 (메시지는 정확하지 않습니다).

2.7.0 ≤ 버전 <2.8.0

<2.7.0 버전의 동작은 의도하지 않았으며 2.7.0으로 수정되었습니다. Orr Sella의 블로그 게시물에 설명 된대로 여전히 커미트 후크를 사용할 수 있습니다. . 이 솔루션은 다른 버전에서도 작동하지만이 버전에는 해당되지 않는 다른 솔루션입니다.

버전 ≥ 2.8.0

Dan Aloni 는 해당 동작을 달성하기위한 옵션을 추가 했습니다 ( 릴리스 정보 참조). ). 함께 사용하십시오 :

[user]
    useConfigOnly = true

작동시키기 위해 전역 설정에서 이름이나 이메일 주소를 제공 할 수 없습니다. 그런 다음 첫 번째 커밋에서 오류 메시지가 나타납니다.

fatal: user.useConfigOnly set but no name given

따라서 메시지는 그다지 유익하지 않지만 옵션을 명시 적으로 설정 했으므로 수행 할 작업을 알아야합니다. <2.7.0 버전의 솔루션과 달리 항상 이름과 전자 메일을 모두 수동으로 설정해야합니다.


나는이 방법을 몇 달 동안 사용했는데 훌륭하게 작동했습니다. 여러 개의 전자 메일 주소 (개인, 회사)가 있고 전역 gitconfig에 "기본"주소를 구성하고 싶지 않습니다. 특별한 값 "(none)"을 사용하면 git은 사용자 이름과 호스트 이름을 기반으로 추측하는 대신 새 저장소를 회전시킬 때마다 유효한 주소를 제공하라는 메시지를 표시합니다 (불쾌하고 수정해야합니다). 그러나 최근 Git (2.7.0, 아마도 이전 버전)의 업그레이드 된 버전에서 특수 값 "(없음)"이 더 이상 치명적 오류를 유발하지 않는다는 것을 알았습니다. 대신 "John Doe <(없음)>"을 그대로 사용합니다.
Zhuoyun Wei

@ wzyboy : 아, 맞아. 나는 git bisect커밋 19ce497c를 찾았습니다 ... 이 행동을 소개했습니다. 그러나 버전 (2.5-2.7)과 독립적으로 구성에서 ( email =인수없이) 사용할 수 email = "(none)"있으며 이전 버전 과 동일한 동작을 보여줍니다 . 이것을 확인할 수 있습니까? 그렇다면 답변을 편집하겠습니다. 나는 그것이 너무 명백해 보이고 회의적이며 전에는 사용하지 않았습니다.
John

email =2.7.0에서 시도했지만 Git은 여전히 ​​사용자 이름과 호스트 이름을 기준으로 이메일 주소를 추측합니다. 나는 이제 pre-commitSella의 블로그에서 접근 방식을 사용 합니다. 나는 또한 "(none)"Sella의 게시물에서 아이디어를 내놓은 Dan Aloni에게이를 통지하고 이를 공식적으로 기능으로 구현하기위한 패치를 제출했습니다. permalink.gmane.org/gmane.comp.version-control.git/285301
Zhuoyun Wei

3
git-2.8 이후 : "user.useConfigOnly"구성 변수를 사용하여 사용자가 항상 user.email & user.name github.com/git/git/blob/master/Documentation/RelNotes/2.8.0을
rofrol

@rofrol 정보를 주셔서 감사합니다. 이에 따라 답변을 업데이트했습니다.
John

24

조건이 포함Git 2.13에 을 적은 작업으로 하나의 컴퓨터에 여러 사용자 / 이메일이 공존 할 수 있습니다.

user.gitconfig내 개인 이름과 이메일이 있습니다. work-user.gitconfig내 직장 이름과 이메일이 있습니다. 두 파일 모두~ 경로에 있습니다.

따라서 내 개인 이름 / 이메일은 기본적으로 적용됩니다. 들어 c:/work/DIR, 내 작품 이름 / 이메일이 적용됩니다. 들어 c:/work/github/DIR, 내 개인 이름 / 이메일이 적용됩니다. 마지막 설정이 적용될 때 작동합니다.

# ~/.gitconfig
[include]
    path = user.gitconfig
[includeIf "gitdir/i:c:/work/"]
    path = work-user.gitconfig
[includeIf "gitdir/i:c:/work/github/"]
    path = user.gitconfig

gitdir 대소 문자를 구분하며 gitdir/i 대소 문자를 구분하지 않습니다.

"gitdir/i:github/"github경로 에있는 모든 디렉토리에 조건부 포함을 적용합니다 .


귀하의 답변에 감사하고 좋은 Tomáš Janoušek는 당신에게 20 일 전에 같은 것을 주었다. 이 답변을 삭제하십시오.
헤지

5
@Hedge 예, 나는 그의 대답을 찬성했지만 창에서 구성하는 데 시간이 걸렸습니다 gitdir/i.
hiPy

@hIpPy가 내 유스 케이스에 직접 적용하여 Tomas의 답변보다 훨씬 쉽게 따라 할 수 있도록 구현했습니다. 나는 둘 다 찬성했다.
Isaac Adams

18

git여러 이름 / 이메일로 작업 할 수있는 또 다른 옵션 은 별칭 git을 사용하고-c 플래그를 하여 전역 및 리포지토리 별 구성을 재정의하는 것입니다.

예를 들어 별명을 정의하면 다음과 같습니다.

alias git='/usr/bin/git -c user.name="Your name" -c user.email="name@example.com"'

작동하는지 확인하려면 다음을 입력하십시오 git config user.email.

$ git config user.email
name@example.com

별칭 대신에 사용자 정의 git실행 파일을 넣을 수도 있습니다 $PATH.

#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="name@example.com" "$@"

리포지토리에 비해 이러한 방법의 장점은 사용자 정의 프로그램이 활성화 될 때 .git/config모든 git리포지토리에 적용된다는 것 git입니다. 이러한 방식으로 (공유) 구성을 수정하지 않고 사용자 / 이름을 쉽게 전환 할 수 있습니다.


14

git aliases (그리고 git configs의 섹션)가 구조에!

명령 행에서 별명을 추가하십시오.

git config --global alias.identity '! git config user.name "$(git config user.$1.name)"; git config user.email "$(git config user.$1.email)"; :'

그런 다음 예를 들어

git config --global user.github.name "your github username"
git config --global user.github.email your@github.email

새로운 또는 복제 된 저장소 에서이 명령을 실행할 수 있습니다.

git identity github

이 솔루션은 자동은 아니지만 전역 ~/.gitconfig및 사용자 설정 user.useConfigOnly을 해제 true하면 git이 새로운 또는 복제 된 리포지토리에서 수동으로 설정하도록 상기시킵니다.

git config --global --unset user.name
git config --global --unset user.email
git config --global user.useConfigOnly true

1
나는 당신의 해결책을 좋아합니다; 그러나, 글로벌 설정을 해제하면 주어진
리포지토리

12

여기에 많은 답변을 읽은 후 전체 단계가 있습니다.

다른 github 계정에 대해 여러 SSH 키 설정을 설정하는 방법

현재 저장된 키 확인을 시작할 수 있습니다

$ ssh-add -l

이전에 모든 캐시 된 키를 삭제하기로 결정한 경우 ( 선택 사항,주의 사항 )

$ ssh-add -D

그런 다음 사용하려는 / 필요한 각 이메일 / 계정에 연결된 ssh pub / priv 키를 만들 수 있습니다

$ cd ~/.ssh
$ ssh-keygen -t rsa -C "work@company.com" <-- save it as "id_rsa_work"
$ ssh-keygen -t rsa -C "pers@email.com" <-- save it as "id_rsa_pers"

이 명령을 수행하면 다음 파일이 생성됩니다.

~/.ssh/id_rsa_work      
~/.ssh/id_rsa_work.pub

~/.ssh/id_rsa_pers
~/.ssh/id_rsa_pers.pub 

인증 에이전트 가 실행 중인지 확인

$ eval `ssh-agent -s`

~ / .ssh 폴더에서 다음과 같이 생성 된 키를 추가하십시오.

$ ssh-add id_rsa_work
$ ssh-add id_rsa_pers

이제 저장된 키를 다시 확인할 수 있습니다

$ ssh-add -l

이제 생성 된 공개 키를 github / bickbuket 서버에 추가 해야 합니다.

각 저장소를 다른 폴더로 복제

사용자 작업을 수행 할 폴더로 이동하여 이를 실행하십시오.

$ git config user.name "Working Hard"
$ git config user.email "work@company.com" 

이것이 ".git / config"의 내용을 확인하는 것을보기 위해

사용자의 위치를 폴더로 이동 인원이 작업이 실행됩니다

$ git config user.name "Personal Account"
$ git config user.email "pers@email.com" 

이것이 ".git / config"의 내용을 확인하는 것을보기 위해

이 두 폴더 사이를 전환하면 개인 코드와 작업 코드를 커밋 할 수 있습니다.

Git Bash를 사용 중이고 Windows에서 ssh 키를 생성해야하는 경우 다음 단계를 수행하십시오.

https://support.automaticsync.com/hc/en-us/articles/202357115-Generating-an-SSH-Key-on-Windows


9

실수를 피하기 위해 잘 작동하는 간단한 해결책이 있습니다.

[user]섹션에서 섹션을 삭제하면 ~/.gitconfig설정하지 않고 커밋 할 수 없습니다.user.name 각 리포지토리에 대한 .

~/.bashrc에서 사용자 및 이메일에 대한 간단한 별칭을 추가 하십시오 .

alias ggmail='git config user.name "My Name";git config user.email me@gmail.com'
alias gwork='git config user.name "My Name";git config user.email me@work.job'

아니 큰 원인은 당신이 모든 자식의 repo의 구성 중복됩니다
cambunctious

9

이 답변은 @Saucier의 게시물에서 부분적으로 영감을 얻었지만 자동으로 설정 user.name하고 설정하는 방법을 찾고있었습니다.user.email 그가 개발하는 자식 여권 패키지보다 조금 더 가벼운 무게했다 원격 기반으로하는 REPO 단위에 . useConfigOnly 설정을 위해 @John도 h / t입니다. 내 해결책은 다음과 같습니다.

.gitconfig 변경 사항 :

[github]
    name = <github username>
    email = <github email>
[gitlab]
    name = <gitlab username>
    email = <gitlab email>
[init]
    templatedir = ~/.git-templates
[user]
    useConfigOnly = true

체크 아웃 후 후크 : 다음 경로에 저장해야합니다. ~/.git-templates/hooks/post-checkout:

#!/usr/bin/env bash

# make regex matching below case insensitive
shopt -s nocasematch

# values in the services array should have a corresponding section in
# .gitconfig where the 'name' and 'email' for that service are specified
remote_url="$( git config --get --local remote.origin.url )"
services=(
    'github'
    'gitlab'
)

set_local_user_config() {
    local service="${1}"
    local config="${2}"
    local service_config="$( git config --get ${service}.${config} )"
    local local_config="$( git config --get --local user.${config} )"

    if [[ "${local_config}" != "${service_config}" ]]; then
        git config --local "user.${config}" "${service_config}"
        echo "repo 'user.${config}' has been set to '${service_config}'"
    fi
}

# if remote_url doesn't contain the any of the values in the services
# array the user name and email will remain unset and the
# user.useConfigOnly = true setting in .gitconfig will prompt for those
# credentials and prevent commits until they are defined
for s in "${services[@]}"; do
    if [[ "${remote_url}" =~ "${s}" ]]; then
        set_local_user_config "${s}" 'name'
        set_local_user_config "${s}" 'email'
        break
    fi
done

github 및 gitlab에 대해 다른 자격 증명을 사용하지만 위 코드의 참조는 사용하는 모든 서비스로 대체되거나 기능을 보강 할 수 있습니다. 체크 아웃 후 사후 점검 후크가 자동으로 리포지토리에 대한 사용자 이름 및 이메일을 로컬로 설정하도록하려면 서비스 이름이 원격 URL에 나타나는지 확인한 후 post-checkout스크립트 의 서비스 배열에 추가하고 해당 섹션을 작성하십시오. 너의.gitconfig 이 해당 서비스에 대한 사용자 이름과 이메일이 포함되어 있습니다.

원격 URL에 서비스 이름이 표시되지 않거나 리포지토리에 원격 서비스가없는 경우 사용자 이름과 전자 메일이 로컬로 설정되지 않습니다. 이 경우 user.useConfigOnly사용자 이름과 전자 메일이 리포지토리 수준으로 설정 될 때까지 커밋을 수행 할 수없는 설정이 실행되고 사용자에게 해당 정보를 구성하라는 메시지가 표시됩니다.


1
훌륭한 솔루션. chmod 755후크 스크립트를 잊지 마십시오 . 그렇지 않으면 복사되지만 실행되지는 않습니다.
onekiloparsec

5

GIT_AUTHOR_EMAIL + 지역 .bashrc

.bashrc_local:이 파일을 추적하지 말고 업무용 컴퓨터에만 두십시오.

export GIT_AUTHOR_EMAIL='me@work.com'
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"

.bashrc:이 파일을 추적하여 업무용 컴퓨터와 가정용 컴퓨터에서 동일하게 만듭니다.

F="$HOME/.bashrc_local"
if [ -r "$F" ]; then
    . "$F"
fi

https://github.com/technicalpickles/homesick 을 사용하여 내 도트 파일을 동기화하고 있습니다.

gitconfig 만 환경 변수를 허용하는 경우 : git config의 쉘 변수 확장


5

윈도우 환경

추가로 Git Extensions --> Settings --> Global Settings시스템에 설치 한 경우 에서에서 수정할 수 있습니다 .

gitextensions- 최신 출시

Windows 환경에서 폴더 / 디렉토리를 마우스 오른쪽 버튼으로 클릭하여 이러한 설정에 액세스하십시오. 여기에 이미지 설명을 입력하십시오

업데이트 : 버전 2.49에서 여러 설정을 전환 / 유지하는 방법 버전 2.49에서 여러 설정을 전환 / 유지하는 방법


여러 사용자를 편집하는 대신 어떻게 해결합니까?

@D_N 설정 전환 옵션이있는 새 스크린 샷으로 업데이트되었습니다.
Abhijeet

로컬 저장소 폴더를 열고 탐색 메뉴에서 git-config를 선택한 다음 로컬 저장소 탭을 클릭하면 위의 답변과 같이 내용이 $ local_repo_path / .git / config에 적용됩니다.
maxwu

3

어쩌면 간단한 해킹 일 수도 있지만 유용합니다. 아래와 같이 2 개의 ssh 키를 생성하십시오.

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/GowthamSai/.ssh/id_rsa): work
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in damsn.
Your public key has been saved in damsn.pub.
The key fingerprint is:
SHA256:CrsKDJWVVek5GTCqmq8/8RnwvAo1G6UOmQFbzddcoAY GowthamSai@Gowtham-MacBook-Air.local
The key's randomart image is:
+---[RSA 4096]----+
|. .oEo+=o+.      |
|.o o+o.o=        |
|o o o.o. +       |
| =.+ .  =        |
|= *+.   S.       |
|o*.++o .         |
|=.oo.+.          |
| +. +.           |
|.o=+.            |
+----[SHA256]-----+

같은 방법으로 개인을 위해 하나 더 만듭니다. 따라서 2 개의 ssh 키, 작업 및 회사가 있습니다. work.pub, work, personal.pub, personal을 ~ / .ssh / 디렉토리로 복사하십시오 .

그런 다음 다음 행으로 쉘 스크립트를 작성하고 다음 컨텐츠로 crev.sh (회사 역)로 이름을 지정하십시오.

cp ~/.ssh/work ~/.ssh/id_rsa
cp ~/.ssh/work.pub ~/.ssh/id_rsa.pub

같은 방법으로 다음 내용으로 prev.sh (Personal Reverse)라는 이름을 하나 더 만듭니다.

cp ~/.ssh/personal ~/.ssh/id_rsa
cp ~/.ssh/personal.pub ~/.ssh/id_rsa.pub

~ / .bashrc에서 아래와 같은 스크립트에 대한 별칭을 추가하십시오.

alias crev="sh ~/.ssh/crev.sh"
alias prev="sh ~/.ssh/prev.sh"
source ~/.bashrc

당신이 회사를 사용하고 싶을 때마다, 그냥 crev를하고, 개인적인 사용을 원한다면 prev :-p.

해당 ssh 키를 GitHub 계정에 추가하십시오. 해당 스크립트가 id_rsa를 덮어 쓰기 때문에 이전에 id_rsa가 생성되지 않았는지 확인하십시오. 이미 id_rsa를 생성 한 경우 계정 중 하나에 사용하십시오. 개인 키로 복사하고 개인 키 생성을 건너 뜁니다.


1

나는 그것을 처리하는 bash 함수를 만들었다. 여기 Github 저장소가 있습니다.

기록 :

# Look for closest .gitconfig file in parent directories
# This file will be used as main .gitconfig file.
function __recursive_gitconfig_git {
    gitconfig_file=$(__recursive_gitconfig_closest)
    if [ "$gitconfig_file" != '' ]; then
        home="$(dirname $gitconfig_file)/"
        HOME=$home /usr/bin/git "$@"
    else
        /usr/bin/git "$@"
    fi
}

# Look for closest .gitconfig file in parents directories
function __recursive_gitconfig_closest {
    slashes=${PWD//[^\/]/}
    directory="$PWD"
    for (( n=${#slashes}; n>0; --n ))
    do
        test -e "$directory/.gitconfig" && echo "$directory/.gitconfig" && return 
        directory="$directory/.."
    done
}


alias git='__recursive_gitconfig_git'

1

~ / .bash_profile에 이것을 추가하여 github.com의 기본 키 사이를 전환하십시오.

# Git SSH keys swap
alias work_git="ssh-add -D  && ssh-add -K ~/.ssh/id_rsa_work"
alias personal_git="ssh-add -D && ssh-add -K ~/.ssh/id_rsa"

1

git commit --author "Your Name <your@email.com>"다른 사용자로 커밋하려는 리포지토리에서 커밋을 수행하는 순간 에도 사용할 수 있습니다 .


0

Rob W의 답변 과 같은 것이지만 다른 ssh 키를 다르게 허용하며 이전 git 버전 (예 : core.sshCommand 구성이 없음)에서 작동합니다.

~/bin/git_poweruser실행 권한과 PATH로 파일을 만들었습니다 .

#!/bin/bash

TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT

cat > $TMPDIR/ssh << 'EOF'
#!/bin/bash
ssh -i $HOME/.ssh/poweruserprivatekey $@
EOF

chmod +x $TMPDIR/ssh
export GIT_SSH=$TMPDIR/ssh

git -c user.name="Power User name" -c user.email="power@user.email" $@

"Power User"로 무언가를 커밋하거나 푸시하려고 할 때마다 git_poweruser대신 사용 합니다 git. 그것은 모든 디렉토리에서 작동해야 하며 적어도 내 에서는 .gitconfig또는 .ssh/config에서 변경을 요구하지 않습니다 .


0

대부분의 질문이 OP에 대답했지만, 나는이 문제를 직접 해결해야했으며 인터넷 검색조차하지 않고 가장 빠르고 간단한 해결책을 찾을 수있었습니다. 간단한 단계는 다음과 같습니다.

  • .gitconfg다른 저장소에서 기존 사본
  • 새로 추가 한 리포지토리에 붙여 넣기
  • .gitconfig이름, 이메일 및 사용자 이름과 같은 파일의 값 변경 [user] name = John email = john@email.net username = john133
  • .gitignore목록 에 파일 이름을 추가 .gitconfig하여 작업 저장소에 파일을 커밋하지 않도록하십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.