LainyZine: 프로그래머 가이드 🐣

GitHub 멀티 어카운트를 사용할 때 유용한 Git 설정

Git과 같은 버전 관리 도구는 협업을 전제로 하고 있으며, 저장소에서 커밋을 할 때 마다 작업자(Author)의 이름과 이메일을 기록합니다. 사용자 이름과 이메일은 로컬 시스템에 전역적으로 설정하거나 저장소 별로 설정해서 사용할 수 있습니다.

1~2개 저장소에서만 다른 사용자 이름과 이메일을 사용하는 경우 저장소 별로 사용자 이름과 이메일을 설정해도 큰 불편함은 없습니다만, 상시적으로 여러 개의 사용자 정보나 GitHub 멀티 어카운트를 사용한다면 이야기가 달라집니다. 또한 Git 커밋을 Push할 때 사용하는 SSH 설정도 저장소마다 달라져야합니다. 이 글에서는 GitHub 멀티 어카운트 환경에서 유용한 Git 설정들을 소개합니다.

글로벌로 설정된 사용자 이름과 이메일 정보 삭제하기

상시적으로 멀티 프로필을 경우에도 저장소 별로 사용자 이름(user.name)과 이메일(user.email)을 설정해서 사용할 수 있습니다.

$ git config user.name "LainyZine"
$ git config user.email lainyzine.com@gmail.com

단, 실수로 저장소에 사용자 이름이나 이메일을 설정하지 않은 경우 global 옵션으로 지정한 값이 사용되기 때문에 의도하지 않은 값이 들어갈 수 있습니다. 이 문제를 방지하기 위해서는 먼저 전역적으로 설정한 사용자 이름과 이메일을 삭제하는 것을 권장합니다.

다음 명령어로 전역적으로 설정한 사용자 정보를 삭제할 수 있습니다.

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

단, 이렇게 전역 설정을 삭제한다고 문제가 완전히 해결되는 건 아닙니다. 전역 설정에도 사용자 정보가 없고, 로컬 저장소에도 사용자 정보가 없을 때 문제가 될 수 있습니다.

Git 사용자 이름과 이메일 정보가 없을 때 커밋을 막는 방법

전역 설정을 삭제하면 의도하지 않은 사용자 정보가 잘못 기록되는 건 방지할 수 있지만, 전역 설정에도 사용자 정보가 없고 로컬 저장소에도 사용자 정보가 없을 때 커밋을 하면 어떻게 될까요? 이 경우 자동적으로 아래 형식을 사용해 커밋의 Author를 기록합니다.

Author: [시스템 사용자 이름] <[시스템 사용자 이름]@[호스트네임]>

이 형식으로 커밋의 Author가 기록되는 것을 방지하기 위해, 사용자 이름(user.name)과 이메일(user.email)이 설정되어있지 않을 때 커밋을 할 수 없도록 설정할 수 있습니다. git configuser.useConfigOnly 값을 true로 설정해줍니다.

$ git config --global user.useConfigOnly true

이 설정은 현재 저장소에서 사용할 수 있는 사용자 정보가 없으면 커밋을 하지 못 하도록 막아줍니다. 이 상태에서 커밋하려고 하면 아래와 같이 에러가 발생합니다.

$ git commit -m'Add .gitignore'
Author identity unknown

*** 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: no email was given and auto-detection is disabled

이 옵션을 활성화하고 사용하는 경우 반드시 저장소마다 사용자 이름과 이메일을 지정해주어야합니다. 조금 번거로울 수도 있습니다만, 글로벌 사용자 프로필을 제거하고,user.useConfigOnly 옵션을 활성화하는 것만으로도 의도하지 않은 Author 값이 기록되는 것을 방지할 수 있습니다.

특정 디렉터리 아래 저장소들의 사용자 정보 설정하기

Git 저장소의 사용자 설정은 크게 전역 설정과 저장소 설정으로 나누어집니다. 전역 설정은 너무 광범위하고, 저장소 별 설정은 범위가 너무 좁아서 번거롭습니다. 전역 설정과 저장소 설정 중간 쯤에 있는 설정 방법이 특정 하위 디렉터리 아래의 저장소들에서 사용하는 사용자 정보를 설정하는 방법입니다. (이 설정은 Git 2.13 이상 버전에서 사용할 수 있습니다.)

예를 들어 GitHub를 회사 계정과 개인 프로젝트 용도의 계정으로 나누어 사용하는 경우를 생각해보겠습니다. 로컬 환경에서, 회사 저장소들은 ~/github/company 디렉터리 아래에서 작업하고, 개인 프로젝트 저장소들은 ~/github/personal 디렉터리 아래에서 작업합니다.

아래 내용을 ~/.gitconfig 파일에 추가해서 특정 디렉터리에 아래 저장소에만 적용되는 Git 설정 파일을 추가할 수 있습니다.

[includeIf "gitdir:[DIR]/"]
    path = [DIR]/.gitconfig

여기서 [DIR]은 원하는 디렉터리로 바꿔줍니다. 앞의 시나리오대로 회사 계정과 개인 계정의 작업 디렉터리를 분리하는 경우 아래와 같이 작성합니다.

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

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

다음으로 회사 계정용 .gitconfig와 개인 계정용 .gitconfig 파일에 사용자 정보를 작성해줍니다. 아래와 같이 [user] 섹션을 추가해주면 됩니다.

먼저 ~/github/company/.gitconfig 예제입니다.

[user]
    name = lainy
    email = lainy@mycompany.com

이제 ~/github/company 아래에 Git 저장소를 초기화하고, 커밋에 기록 되는 사용자 정보를 확인해보겠습니다.

$ cd ~/github/company
$ mkdir git-repo
$ cd git-repo
$ git init

$ git config user.name
lainy
$ git config user.email
lainy@mycompany.com

의도한 대로 동작하는 것을 확인할 수 있습니다.

다음으로 ~/github/personal/.gitconfig 예제입니다. company 경우와 마찬가지로 원하는 사용자 정보를 설정해주면, 이제 ~/github/personal 디렉터리 아래의 Git 저장소에서는 이 정보가 사용됩니다.

[user]
    name = lainyzine
    email = lainyzine.com@gmail.com

하나씩 사용자 정보를 지정하는 것보다 훨씬 편리하게 사용할 수 있습니다.

GitHub SSH 프로토콜로 Push할 때 다른 SSH 키 사용하기

GitHub를 원격 저장소를 사용할 때, SSH 프로토콜을 사용하게 안전하게 원격 Git 저장소 작업을 할 수 있습니다. SSH 프로토콜을 사용하려면 먼저 공개키와 개인키를 만들어야합니다.

하나의 GitHub 계정을 사용한다면 아무런 문제가 없습니다만, 여러 개의 계정을 사용한다면 상황이 조금 복잡해집니다. 예를 들어 GitHub 계정을 lainyzine-company와 lainyzine-personal 두 개 사용하는 상황을 가정해보겠습니다. GitHub에서는 같은 공개키를 서로 다른 계정에 등록하는 것이 불가능합니다. 공개키는 고유한 개인키와 조합으로 사용자를 식별하는 값으로 사용되기 때문입니다. 즉, GitHub에서는 어떤 개인키로 접속하는지에 따라 GitHub 사용자를 식별합니다. 따라서 계정마다 SSH 공개키와 개인키를 만들고 저장소 별로 설정을 따로 해야합니다.

각 계정 별 개인키 경로가 다음과 같다고 가정하겠습니다.

이 경우 아래와 같이 ~/.ssh/config 파일을 수정합니다. 파일이 없다면 새로 만듭니다.

Host github-company
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/id_ed25519-lainyzine-company

Host github-personal
  User git
  Port 22
  HostName github.com
  IdentityFile ~/.ssh/id_ed25519-lainyzine-personal

이제 호스트 이름을 github.com 대신 github-companygithub-personal을 사용해 SSH 인증 계정(SSH 키)을 변경해가며 작업할 수 있습니다.

예를 들어 lainyzine-company는 lainy-company/awesome-project 저장소에 권한을 가지고 있다고 가정해보겠습니다. 이 저장소의 주소는 다음과 같습니다.

git@github.com:lainyzine/lainyzine.git

로컬 저장소에서는 이 주소를 원격 저장소에 등록할 때 일반적으로 다음 명령어를 실행해줍니다.

$ git remote add upstream git@github.com:lainyzine/lainyzine.git

이 때 ~/.ssh/id_ed25519-lainyzine-company 개인키를 사용하려면 아래 주소를 사용합니다.

git@github-company:lainyzine/lainyzine.git

즉, github.com 대신 github-company를 사용합니다. 원격 저장소를 등록할 때도 이 주소를 사용해야합니다.

$ git remote add upstream git@github-company:lainyzine/lainyzine.git

이와 마찬가지로 개인 프로젝트에서는 github.com 대신 github-personal로 등록해주면 됩니다.

추천 문서

LainyZine은 쿠팡 파트너스 활동에 따른 수수료를 제공받습니다.