개발자 노트
[Github] 회사 계정과 개인 계정 분리해서 사용하기 본문
-- 문제 --
회사에서 사용하는 깃허브 계정과 개인적으로 사용하는 깃허브 계정이 분리되어 있는데, 현재 로컬의 git user email은 회사 깃허브 계정만 등록해서 사용하고 있다. 그런 상황에서 개인 깃허브 저장소 프로젝트를 clone한 후 commit을 추가하고 push를 시도하니 저장소에 push 권한이 없다는 에러가 났다.
하지만 여전히 나는 로컬에서 두 계정 모두를 자유롭게 이용하고 싶었다.
-- 해결 --
로컬에서 사용할 각각의 깃허브 계정마다 SSH 키를 생성하고 해당 깃허브 페이지에서 생성한 공개키를 등록한 다음, 로컬에서 config 파일을 이용해 계정 이메일을 분리해서 설정해두면 된다. 해당 내용은 단계별로 기록했다.
1. SSH 키 생성 (개인 & 회사 깃허브 계정 이메일)
$ cd ~/.ssh
$ ssh-keygen -t rsa -C "your_email@example.com"
~/.ssh 폴더로 이동한 후 위의 명령어를 입력하면 SSH 키를 생성할 수 있다. "your_email@example.com" 에는 개인 깃허브 계정 이메일을 입력하면 된다. 위의 명령어를 입력하면 아래와 같은 단계를 거친다.
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/닉네임/.ssh/id_rsa): id_rsa_me
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
개인 깃허브 계정에 대한 SSH 키를 생성할 것이기 때문에, 이름을 id_rsa_me 라고 입력했다. 그리고 passphrase를 입력하라고 하는데 아무것도 입력하지 않고 엔터를 눌렀다. 실행이 완료하면 id_rsa_me 와 id_rsa_me.pub 파일이 생성된다.
그리고 이번에는 회사 깃허브 계정 이메일을 입력해서 SSH 키를 생성한다. 회사용 키 이름은 id_rsa_work 로 했다. 그러면 id_rsa_work 와 id_rsa_work.pub 파일이 생성된다.
2. ssh config 파일 설정 및 ssh 키 ssh-agent에 등록
$ eval "$(ssh-agent -s)" // ssh-agent 실행
$ open ~/.ssh/config // config 파일을 연다.
$ touch ~/.ssh/config // config 파일이 없으면, 파일을 만든다.
$ open ~/.ssh/config // 파일이 만들어졌으니, 다시 파일을 연다.
~/.ssh/config 파일에 아래의 정보를 입력하고 저장한다.
# 개인 계정
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_me
# 회사 계정
Host github.com-work
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_work
위 설정은, 일종의 변환을 위한 설정이다. 예를 들자면, 아래 이미지처럼 clone 하고 싶은 깃허브 저장소에 가서 SSH로 clone을 하려고 주소를 보면 git@github.com:programmer-heeney/practice-git.git 로 되어있다. 그런데 이 주소를 그대로 복사해서 사용하는 것이 아니라 수동으로 git@github.com-work:programmer-heeney/practice-git.git 이런식으로 원하는 계정에 맞게 수정한 주소를 clone 해야한다(리모트 저장소로 등록할 때도 수동으로 설정해줘야한다). 예제는 회사 계정으로 프로젝트를 관리하려고 Host를 github.com-work 로 설정했다. 그러면 설정해둔 config 파일의 내용처럼 github.com-work는 실제 호출할 때는 HostName으로 설정한 github.com 을 사용하고, IdentifyFile로 설정해둔 id_ras_work ssh 키를 사용한다.
참고로 개인용은 별도의 수정 없이 사용하려고 Host를 github.com 으로 설정해뒀다.
$ ssh-add --apple-use-keychain ~/.ssh/id_rsa_me // 개인용 ssh 키 등록
$ ssh-add --apple-use-keychain ~/.ssh/id_rsa_work // 회사용 ssh 키 등록
3. 깃허브 페이지에 공개키 등록
$ cat id_rsa_me.pub | pbcopy // 개인용 ssh 공개키 복사
개인용 깃허브에 접속하면 우측 상단에 프로필 > Settings 메뉴 > SSH and GPG Keys 메뉴에 들어가면 위의 화면을 볼 수 있다. New SSH key 를 클릭하면, title은 자유롭게 입력하고 본문에는 복사한 공개키(.pub) 내용을 붙여 넣으면 된다.
같은 방식으로 회사용 SSH 공개키를 복사해서 회사용 깃허브에 접속하여 공개키를 등록한다.
$ cat id_rsa_work.pub | pbcopy // 공개용 ssh 공개키 복사
4. .gitconfig 설정으로 commit 계정 분리하기
깃 커밋 메시지를 작성할 때 이메일과 이름 정보가 들어가는데, 이젠 개인용/회사용 프로젝트에 따라 커밋 메시지 계정이 잘 연결되도록 설정을 해줘야한다. 저장소별 로컬 프로젝트마다 config 파일을 설정하는 건 번거로우니 개인용/회사용으로 프로젝트 저장용 폴더를 분리해두고 전역 .gitconfig 파일을 수정해서 사용하는 편이 편하다.
1. 먼저 회사용 깃허브 계정 정보를 저장해두고 사용할 .gitconfig-work 파일을 만든다.
$ touch ~/.gitconfig-work // 회사용 계정정보를 담은 파일을 생성한다.
$ open ~/.gitconfig-work // 생성한 파일을 연다.
[user]
name = 회사용 깃허브 계정 이름
email = 회사용 깃허브 계정 이메일
2. 전역 .gitconfig 파일에 개인용 계정으로 user 정보를 저장하고 icludeIf 섹션을 이용해서 회사용 프로젝트가 지정해둔 폴더 하위(~/projects/works/)에 있으면 .gitconfig-work 파일을 추가로 불러와 회사용으로 저장해둔 user 정보를 사용하도록 등록한다.
$ open ~/.gitconfig // 전역 .gitconfig 파일을 연다.
[user]
name = 개인용 깃허브 계정 이름
email = 개인용 깃허브 계정 이메일
[includeIf "gitdir:~/projects/works/"]
path = .gitconfig-work
5. 여전히 push가 안된다면 >> 기존 레포지토리 remote origin 주소 변경
SSH가 아닌 HTTPS 로 클론해오거나 remote origin url 이 설정되어져 있던 기존의 개인용 로컬 프로젝트 폴더에서 push 해보았더니, 여전히 원격 저장소 접근 에러가 발생했다. 그래서 해당프로젝트폴더경로/.git/config 에서 remote url을 변경한 후 다시 시도해보니 push가 잘 된 것을 확인할 수 있었다.
$ open .git/config // git 프로젝트 폴더 경로에서 .git/config 파일을 연다.
// 아래처럼 remote 섹션의 url을 ssh 다운로드 경로로 수정한다.
[remote "origin"]
url = git@github.com:programmer-heeney/practice-git.git
만약 회사 계정으로 해당 프로젝트를 관리하고 싶다면 아래처럼 설정해주면 된다. 즉, @뒤에 오는 host는 위에서 ~/.ssh/config 파일에서 설정해둔 host로 입력해주면된다.
[remote "origin"]
url = git@github.com-work:programmer-heeney/practice-git.git
-- 참고 문서 --
'▶ FRONT-END ◀' 카테고리의 다른 글
[TS] Property does not exist on type '{}'. (0) | 2023.01.12 |
---|---|
[Vue] object method에서 this가 undefined로 나오는 이슈 (0) | 2023.01.10 |
flex-wrap 문제, 컨테이너는 가운데 정렬 && 아이템은 왼쪽 정렬 (1) | 2020.12.06 |
[JS] net::ERR_ABORTED 404 (Not Found) 에러 (0) | 2020.12.05 |
display: flex로 설정한 부모노드에서 자식노드인 버튼을 숨기는 방법 (0) | 2020.12.02 |