주어진 프로젝트에 대해 올바른 ID (이름 및 이메일)를 사용하도록 git에게 알리는 방법은 무엇입니까?


117

저는 업무용과 개인용 프로젝트 모두에 개인용 노트북을 사용하고, 직장에서의 커밋에는 제 업무용 이메일 주소 (gitolite)를 사용하고 나머지에는 제 개인용 이메일 주소 (github)를 사용하고 싶습니다.

나는 모두 전역 적이거나 일시적인 다음 솔루션에 대해 읽었습니다.

  • git config --global user.email "bob@example.com"
  • git config user.email "bob@example.com"
  • git commit --author "Bob <bob@example.com>"
  • 하나의 설정 GIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAIL또는 EMAIL환경 변수

한 가지 해결책은 내 환경을 work 또는 personal으로 설정하는 셸 함수를 수동으로 실행하는 것이지만, 올바른 ID로 전환하는 것을 잊고 잘못된 ID로 커밋하는 경우가 종종있을 것입니다.

특정 저장소, 프로젝트 이름 등을 ID (이름, 이메일)에 바인딩하는 방법이 있습니까? 사람들은 무엇을합니까?


1
답변 중 하나를 수락 해 주시기 바랍니다. 그들 중 하나가 당신의 문제를 해결하는 데 도움이 되었기를 바랍니다.
RBT

답변:


134

git config user.email "bob@example.com"

리포지토리 내에서이 작업을 수행하면 전역이 아닌 해당 리포지토리에 구성이 설정됩니다.

내가 당신을 잘못 읽지 않는 한 그게 당신이 추구하는 것 같습니다.


그렇게해야한다고 생각합니다. 특히 모든 것을 다시 컴파일하지 않고도 분기 간을 더 쉽게 전환하기 위해 동일한 프로젝트에 대해 여러 로컬 저장소가있을 것으로 예상하고 있습니다. 어쩌면 그것은 나쁜 SVN 습관 일 수도 있습니다. 감사.
Martin Jambon

1
@Martin-저는 git을 오랫동안 사용하지 않았지만 여러 로컬 저장소를 사용하는 것이 git에게는 비정상적인 워크 플로가 될 것이라는 느낌을 받았습니다. 그렇다하더라도 리포지토리의 인스턴스에서 한 번만 실행하면되고 해당 리포지토리의 수명으로 설정되어 있으므로 그렇게 나쁘지는 않습니다.
Dan Ray

@DanRay Martin의 경우와 같이 로컬 리포지토리에 로컬 커밋되지 않은 파일이있는 경우 실제로 일반적인 설정입니다. 한 분기에서 다른 분기로 전환하면 파일이 자동으로 다시 빌드되지 않습니다. "모든 것을 다시 컴파일하는 것"을 피하는 것이 목표라면 여러 로컬 저장소를 사용하는 것이 올바른 방법입니다.
고인돌

1
git config --global user.email "bob@example.com"--global을 추가하면 모든 저장소에서 작동합니다. 출처 : help.github.com/articles/setting-your-username-in-git
SashiOno

1
이것은 수동 작업이며 잊혀 질 수 있습니다. 자동 솔루션을 제안하는 @ dragon788
naitsirch

47

아래 의 local set 명령 을 사용해야합니다 .

지역 세트

git config user.email mahmoud@company.ccc
git config user.name 'Mahmoud Zalt'

지역 가져 오기

git config --get user.email
git config --get user.name

로컬 구성 파일은 프로젝트 디렉토리에 .git/config있습니다..

글로벌 세트

git config --global user.email mahmoud@zalt.me
git config --global user.name 'Mahmoud Zalt'

글로벌 겟

git config --global --get user.email
git config --global --get user.name

홈 디렉토리의 전역 구성 파일 : ~/.gitconfig.

공백 등을 따옴표로 묶어야합니다 (예 : 'FirstName LastName').


23

저장소에 따라 다른 사용자 이름과 이메일을 유지하려면 ".git"폴더에있는 구성 파일을 편집하십시오.

  • 저장소로 이동
  • 숨겨진 파일을 표시하고 ".git"폴더로 이동합니다.
  • "구성"파일 찾기
  • EOF에 아래 줄을 추가하십시오.

[사용자]

이름 = Bob

이메일 = bob@example.com

아래 명령은이 저장소에 대해 설정된 사용자 이름과 이메일을 보여줍니다.

git config --get user.name

git config --get user.email

예 : D : \ workspace \ eclipse \ ipchat \ .git \ config에있는 해당 구성 파일의 경우

여기 ipchat은 내 저장소 이름입니다.


16

사용 git config user.email "foo@example.com"하면 현재 프로젝트에 바인딩됩니다.

그것이 제가 프로젝트를 위해하는 일입니다. 리포지토리를 복제 / 초기화 할 때 적절한 ID를 설정했습니다. 그것은 당신이 말을 할 수있는 능력없이 얻을 수있는 것만 큼 좋은 것입니다.git config --global user.email 'ILLEGAL_VALUE'

사실, 당신은 불법적 인 가치를 만들 수 있습니다. 설정git config --global user.name $(perl -e 'print "x"x968;')

그런 다음 비전 역 값을 설정하는 것을 잊은 경우 오류 메시지가 표시됩니다.

[편집] 다른 시스템에서 "치명적 : 엄청나게 긴 개인 식별자"로 실패하도록 x의 수를 968 개로 늘려야했습니다. 같은 버전의 git. 이상한.


훌륭한 속임수처럼 들리지만 저에게는 효과가 없었습니다. 커밋과 gitolite 원격 푸시가 모두 성공했습니다.
Martin Jambon

@Martin Jambon : 이상합니다. 저는 git 버전 1.7.4.5를 사용하고 있습니다
Seth Robertson

@Martin Jambon : 글로벌 사용자 이름 / 이메일 주소를 "x"로 설정할 수도 있습니다. 일부 이전 버전의 git은 너무 작은 값을 거부했습니다. 이것이 작동하지 않으면 가지고있는 git 버전 / OS를보고하십시오.
Seth Robertson

@Martin Jambon : 968 "x"를 시도해보고 그것이 당신에게 더 잘 작동하는지 확인하십시오.
Seth Robertson

8

--global매개 변수를 사용하지 않으면 현재 프로젝트에 대해서만 변수가 설정됩니다.


8

Git 2.13 includeIf부터는 gitconfig에서를 사용 하여 git 명령을 실행중인 저장소의 경로에 따라 다른 구성을 가진 파일을 포함 할 수 있습니다 .

새로운 충분한 Git이 Ubuntu 18.04와 함께 제공되기 때문에 나는 이것을 ~/.gitconfig매우 행복하게 사용하고 있습니다.

[include]
  path = ~/.gitconfig.alias # I like to keep global aliases separate
  path = ~/.gitconfig.defaultusername # can maybe leave values unset/empty to get warned if a below path didn't match
# If using multiple identities can use per path user/email
# The trailing / is VERY important, git won't apply the config to subdirectories without it
[includeIf "gitdir:~/projects/azure/"]
  path = ~/.gitconfig.azure # user.name and user.email for Azure
[includeIf "gitdir:~/projects/gitlab/"]
  path = ~/.gitconfig.gitlab # user.name and user.email for GitLab
[includeIf "gitdir:~/projects/foss/"]
  path = ~/.gitconfig.github # user.name and user.email for GitHub

https://motowilliams.com/conditional-includes-for-git-config#disqus_thread

Git 2.13을 사용하려면 PPA (18.04 / Debian 이전 Ubuntu)를 추가하거나 바이너리를 다운로드하고 설치 (Windows / 기타 Linux)해야합니다.


매우 도움이되고 정확히 내가 찾던 것. git config core.sshCommand여러 개인 키 와 결합하여 완벽하게 원활한 git ID 관리를 제공합니다.
topr

0

한 가지 해결책은 내 환경을 업무용 또는 개인용으로 설정하는 셸 기능을 수동으로 실행하는 것이지만 올바른 ID로 전환하는 것을 잊어 버려 잘못된 ID로 커밋되는 경우가 많습니다.

그것은 정확히 내 문제였습니다. github 원격이 있고 로컬 사용자 이름을 정의 하지 않은 경우 경고하는 후크 스크립트를 작성했습니다 .

설정 방법은 다음과 같습니다.

  1. 글로벌 후크를 보관할 디렉토리 생성

    mkdir -p ~/.git-templates/hooks

  2. git init 또는 clone 을 실행할 때 git에게 모든 것을 ~/.git-templates프로젝트 별 .git디렉토리 에 복사 하도록 지시하십시오.

    git config --global init.templatedir '~/.git-templates'

  3. 그리고 이제 다음 줄을 복사하여 ~/.git-templates/hooks/pre-commit파일을 실행 가능하게 만드십시오 (그렇지 않으면 git가 실행하지 않습니다!)

#!/bin/bash

RED='\033[0;31m' # red color
NC='\033[0m' # no color

GITHUB_REMOTE=$(git remote -v | grep github.com)
LOCAL_USERNAME=$(git config --local user.name)

if [ -n "$GITHUB_REMOTE" ] && [ -z "$LOCAL_USERNAME" ]; then
    printf "\n${RED}ATTENTION: At least one Github remote repository is configured, but no local username. "
    printf "Please define a local username that matches your Github account.${NC} [pre-commit hook]\n\n"
    exit 1
fi

개인 리포지토리에 다른 호스트를 사용하는 경우 github.com필요에 따라 교체 해야합니다.

이제 git init또는 git clonegit 을 수행 할 때마다이 스크립트를 저장소에 복사하고 커밋이 완료되기 전에 실행합니다. 로컬 사용자 이름을 설정하지 않은 경우 경고를 출력하고 커밋 할 수 없습니다.


0

나는 이 주제 에 대한 그의 기사 ( Set Up Git Identities 참조)에서 Micah Henning의 방식을 매우 좋아합니다 . 그가 생성 / 복제 된 각 저장소에 ID를 적용하고 강제한다는 사실은 매번 설정하는 것을 잊지 않는 좋은 방법입니다.

기본 git 구성

git에서 현재 사용자 구성을 설정 해제하십시오.

$ git config --global --unset user.name
$ git config --global --unset user.email
$ git config --global --unset user.signingkey

각각의 새 로컬 저장소에서 ID 구성을 강제하십시오.

$ git config --global user.useConfigOnly true

identity명령에 대한 Git 별칭을 만듭니다 . 나중에 사용할 것입니다.

$ 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 user.signingkey "$(git config user.$1.signingkey)"; :'

신원 생성

GPG로 ID를 만듭니다 ( 시스템에있는 항목을 사용 gpg하거나 사용 gpg2). 사용하려는 각 ID에 대해 다음 단계를 반복합니다.

참고 : 생성 된 비밀 키 [keyid]식별자 는 다음과 같습니다 . 여기에 예 :

sec   rsa4096/8A5C011E4CE081A5 2020-06-09 [SC] [expires: 2021-06-09]
      CCC470AE787C057557F421488C4C951E4CE081A5
uid                 [ultimate] Your Name <youremail@domain>
ssb   rsa4096/1EA965889861C1C0 2020-06-09 [E] [expires: 2021-06-09]

다음 8A5C011E4CE081A5부분 은 키 sec rsa4096/식별자 입니다.

$ gpg --full-gen-key
$ gpg --list-secret-keys --keyid-format LONG <youremail@domain>
$ gpg --armor --export [keyid]

공개 키 블록을 복사하여 GitHub / GitProviderOfChoice 설정에 GPG 키로 추가합니다.

Git 구성에 ID를 추가합니다. 또한 추가하려는 각 ID에 대해이 작업을 반복하십시오.

참고 : 여기 내가 사용 gitlab하는 이름을 내 정체성을하지만, 귀하의 질문에서 아무것도, 예 될 수 있습니다 gitolite또는 github, work

$ git config --global user.gitlab.name "Your Name"
$ git config --global user.gitlab.email "youremail@domain"
$ git config --global user.gitlab.signingkey [keyid]

저장소에 대한 ID 설정

새 저장소에 ID가 연결되어 있지 않으면 커밋시 오류가 표시되어 설정하라는 메시지가 표시됩니다.

*** Please tell me who you are.

## parts of message skipped ##

fatal: no email was given and auto-detection is disabled

새 저장소에서 원하는 ID를 지정하십시오.

$ git identity gitlab

이제 gitlab ID 로 커밋 할 준비가되었습니다 .

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