Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Git 계정 여러 개 동시 사용하기

코드 저장소로 GitHub을 주로 사용해 왔는데 요즘은 회사에서도 GitHub을 쓰는 경우가 많아져서 계정 관리가 신경 쓰이는 편이다. 물론 사내에 이상한(?) 코드 저장소가 있는 것보다는 GitHub을 쓰는 걸 훨씬 선호하지만, GitHub Enterprise를 쓰면 상관없지만 GitHub.com을 쓰면 개인 계정과 회사 계정을 섞어서 써야 한다.

예전에는 GitHub Enterprise를 사용했었는데 커밋할 때 결국은 회사 이메일과 개인 이메일을 구분해서 하기가 어려워서 엔터프라이즈에도 개인 이메일을 등록해서 사용했다. 이때는 서비스 자체가 완전히 분리되어 있어서 큰 상관이 없었는데 지난 회사에서 GitHub.com의 같은 계정으로 회사 일까지 하다 보니까 꽤 불편함이 느껴졌다.

GitHub 컨트리뷰션 그래프

일단 컨트리뷰션 그래프에서 개인 사이드 프로젝트나 오픈소스 활동이 회사 코드 작업과 섞이는 게 별로였다. 이건 컨트리뷰션을 꽉 채우고 싶다거나 그런 것보다 나로서 둘은 완전히 타입이라서 이 둘이 섞여 있는 게 불편하게 느껴졌다. 나중에 시간이 지나서 "이때는 개인 코딩은 못 했구나", "이때는 정말 열심히 했구나" 혹은 "이때는 회사 일을 열심히 했구나" 같은 걸 돌아보고 싶은데 그런 게 되지 않는다. GitHub에서 이런 필터링이 지원된다면 해결될 일이긴 하지만... 어차피 회사 저장소는 Private라서 시간 지나면 컨트리뷰션 그래프에 표시만 되지 내용을 볼 수 있는 게 아니기도 하고...

가장 불편한 것은 "알림"이 섞이는 것이었다. 오픈소스 쪽에 워치를 걸어두어서 받는 알림이 많다 보니 의외로 회사 GitHub 알림을 놓치기도 하고 회사 일을 할 때랑 개인 코딩을 할 때랑 시간대가 완전히 다른데 주말에 코딩하다가 불필요한 회사 GitHub 알림을 보게 되거나 하는 건 내가 원하는 게 아니었다. 그냥 딱 분리되어서 내가 의식적으로 두 영역을 왔다 갔다 하기를 바랐다.

GitHub 계정 분리하기

그래서 이번에는 GitHub 계정을 분리해서 사용하기로 했다. 주변에서 마찬가지로 불편하다는 얘기도 들었지만, 같이 썼을 때의 불편함은 느껴봤으니 이번엔 따로 써보자는 생각이었다.

회사 이메일로 GitHub 계정을 새로 만들기는 쉽고 요즘 브라우저에서는 프로필 기능 등으로 GitHub의 계정을 따로 사용하는 건 어렵지 않지만, 메일이 중복 등록은 당연히 안되므로 Git 커밋을 할 때 계정에 맞게 잘 해주어야 한다. 회사 업무에 개인 이메일을 쓰거나 반대로 하면 커밋이 다른 계정에 연결되게 된다.

그래서 중요한 부분은 저장소에 맞게 (실수 없이) 원하는 이메일 주소로 커밋할 수 있어야 하고, git clone이나 git push를 할 때 올바른 SSH 키를 사용할 수 있어야 한다.

SSH 키 분리

회사 계정에서 사용할 SSH 키를 생성한다. 기존에 쓰던 SSH 키는 개인 계정에 등록되어 있으므로 회사 계정용 SSH 키를 따로 만들어야 한다.(중복 등록을 할 수 없다.)

SSH 키는 ~/.ssh/config 파일에서 호스트별로 관리할 수 있다.

# work account
Host work-github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/github-outsider-work

위 설정은 호스트가 work-github.com로 되어 있으면 실제 호스트는 github.com를 사용하고 SSH 키 파일도 ~/.ssh/github-outsider-work를 사용하라는 의미이다.

즉, mocha같은 경우 클론할 때 git@github.com:mochajs/mocha.git 주소를 사용하는데 git@work-github.com:mochajs/mocha.git를 사용해야 한다. 여기서 github.comwork-github.com으로 변경했다. 이는 클론하거나 리모트 저장소를 등록할 때 수동으로 변경해줘야 하지만 원격 저장소는 처음 세팅할 때만 신경 쓰면 이후로는 주소를 매번 입력하는 것은 아니라서 나한테는 받아들일 만한 불편함이다.(정 귀찮아지면 간단한 크롬 익스텐션을 만들어서 써도 될 것 같다.)

이메일 주소 분리

커밋할 때 사용하는 이메일 주소는 ~/.gitconfig 파일에 전역으로 설정해 놓고 사용하는 것이 보통이다. 저장소별 로컬 config마다 설정하면 되긴 하지만 작업을 해보면 자연스럽게 Git 저장소를 클론하고 작업을 하므로 매번 실수하기 마련이다.

encyphered님인 pre-commit 얘기를 해주셔서 처음에는 pre-commit 훅을 이용하려고 했다. Git의 템플릿 기능을 사용해서 미리 pre-commit 훅을 넣어두면 새 저장소를 초기화할 때마다 훅이 기본 설정되므로 잘못된 저장소에 잘못된 이메일로 커밋하는 것을 차단할 수 있다. 대신 컴퓨터에 개인 프로젝트와 회사 프로젝트가 섞여 있으므로 사용할 때 신경을 좀 써야 한다.

그러다가 Obliviscence님이 Includes 설정에 대해서 알려주셔서 좀 찾아보니 이 기능이 내가 딱 원하던 기능이었다.

.gitconfig에 설정하는 includeincludeIf 섹션을 원하는 설정 파일을 추가로 불러오게 할 수 있다.

예를 들어 다음과 같이 ~/.gitconfig 전역 설정 파일을 만들어 보자.

[user]
  email = outsideris@gmail.com
  name = Outsider
  signingkey = 131EA9B1
[includeIf "gitdir:~/my-company-project/"]
  path = .gitconfig-work

여기서는 includeIf 섹션을 사용했는데 이 설정은 Git 디렉터리가 ~/my-company-project/ 디렉터리 아래 있다면 ~/.gitconfig-work 파일을 추가로 불러오도록 한 것이다.

~/.gitconfig-work 파일은 다음과 같다.

[user]
  email = outsider@my-company.com
  name = Outsider
[github]
  user = outsider-biz

테스트해본 결과 원래의 ~/.gitconfig 설정에 ~/.gitconfig-work를 추가로 사용하기 때문에 aliasmerge처럼 공통으로 사용하는 설정은 추가로 적어줄 필요 없고 덮어쓸 설정만 지정하면 된다.

나 같은 경우 개인 프로젝트와 회사 프로젝트가 상위 폴더부터 분리해서 사용하는 편이고 이를 섞는 일은 없으므로 includeIf가 딱 내가 원하던 설정이다. 2주 정도 사용해 보고 있는데 별도로 신경 쓰지 않아도 되면서 편하게 잘 쓰고 있다. 별일 없으면 앞으로도 업무용 GitHub을 분리해서 사용할 계정이고 회사를 이직하더라고(이직한 지 얼마 되지도 않아놓고!!) 같은 업무용 계정을 쓰면 회사별로 얼마나 커밋 양이 달라지는지도 한눈에 볼 수 있을 것 같다.

2019/06/08 16:33 2019/06/08 16:33