회사에서는 사내 GitLab을 사용하는데, 평소에 GitHub만 써 왔기 때문에 GitLab 로그인 방법을 찾아 보고 ssh keygen으로 적당히 등록하고 '로그인 됐겠지' 라는 마음으로 신나게 commit하고 push한 결과, 로그인이 하나도 안 돼 있었다. commit 이력의 내 이름을 눌러 보면 GitHub에서 쓰던 메일 주소로의 mailto: 링크가 걸려있을 뿐...
이런 불상사를 겪는 사람이 없도록, 또 bash 환경에 익숙치 않아서 나처럼 계속 삽질을 하는 사람이 없도록 Git 다중 계정 사용 방법을 적어놓고자 한다.
ssh key 생성하기
Git 계정을 다중으로 이용할 경우 ssh key를 이용하여 계정을 관리하면 된다고 한다. 터미널을 켜서 ssh key를 생성하도록 하자.
$ ssh-keygen -t <YOUR-KEY-TYPE> -C "<YOUR-GIT-EMAIL>"
YOUR-KEY-TYPE에는 ssh key 타입이, YOUR-GET-EMAIL에는 본인이 Git 로그인 시 사용하는 이메일 주소를 따옴표로 감싸서 적자. -C는 ssh key 생성 시 public key에 코멘트를 다는 용도인 것 같은데, 대부분 이메일을 코멘트로 다는 듯 하다.
참고로, 현재 GitHub와 GitLab의 ssh keygen 가이드에서는 모두 key 타입에 Ed25519를 사용하는 것을 추천하고 있다. Ed25519 암호화가 불가능한 경우, 4096-bit RSA로 암호화하도록 하자. 해당 암호화를 하기 위해서는 bit를 지정해줘야 하기 때문에 아래와 같이 입력해 주어야 한다.
$ ssh-keygen -t rsa -b 4096 -C "<YOUR-GIT-EMAIL>"
해당 명령어를 입력하고 엔터를 누르면 어디에 어떤 이름으로 key를 저장할 것이냐고 물어 본다. 키를 하나만 생성하는 경우라면 상관 없겠지만, 우리는 Git 계정을 다중으로 등록하는 것을 목적으로 하고 있기 때문에 key 파일의 이름을 적당히 등록해 주자.
이후에 물어보는 잡다한 것들은 아무것도 입력하지 않고 엔터로 넘겨도 된다.
해당 과정이 모두 문제없이 진행된다면, 확장자가 없는 ssh key(private)와 .pub 확장자의 ssh key(public)이 쌍으로 생성될 것이다.
ssh key 적용하기
생성한 ssh key를 config에 적용하는 단계이다. ~/.ssh/config을 생성하여 아래와 같이 추가해 주자.(해당 파일이 이미 존재한다면 해당 파일에 입력해도 무방함.)
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519_github
Host works.gitlab.com
HostName git.company.com
Port 443
User git
IdentityFile ~/.ssh/id_ed25519_works_gitlab
Host에 있는 주소는 앞으로 명령어로 접근할 때 사용할 임의의 주소고, HostName은 해당 주소를 입력했을 때 실제로 연결할 주소이다. 혹시 임의의 포트로 연결된다면 Port를 선언한 후 포트 번호를 입력해 주면 ssh로 연결할 시 -p 옵션으로 포트 번호를 입력하지 않아도 자동으로 해당 포트로 연결된다.
ssh key 등록하기
지금까지 생성한 ssh key를 등록해 준다.
$ ssh-add ~/.ssh/id_ed25519_github
$ ssh-add ~/.ssh/id_ed25519_works_gitlab
public ssh key를 Git에 등록하기
생성한 ssh key 중 public ssh key를 복사하여 Git에 등록하자.
a. GitHub에 등록하기
$ cat ~/.ssh/id_ed25519_github.pub
public ssh key를 시작부터 끝까지 전부 복사한다. (ssh-ed25519~EMAIL까지 모두)
GitHub의 ssh settings에 들어가서 ssh key를 등록해 준다.
b. GitLab에 등록하기
$ cat ~/.ssh/id_ed25519_works_gitlab.pub
똑같이 복사하여 이번엔 GitLab의 ssh settings에 들어가서 ssh key를 등록해 준다.
GitHub과는 다르게 expiry date를 설정해 주어야 한다.
ssh 확인하기
설정한 것이 잘 됐는지 확인해 보자.
$ ssh -T git@github.com
위에서 생성한 config 파일에서 <User>@<Host>로 ssh 접속을 시도한 것이다.
접속에 성공했다면,
> Hi <USERNAME>! You've successfully authenticated, but GitHub does not provide shell access.
위와 같은 메시지가 뜰 것이다.
Git config에서 이름과 이메일 설정하기
지금까지 터미널로 Git을 사용한 사람이라면 대부분 git config --global user.name과 git config --global user.email을 사용하여 Git을 이용했을텐데, Git 계정이 여러 개라면 이것을 각각 설정해 주어야 하기 때문에 설정하는 단계를 밟아야 한다.
방법은 크게 두 가지가 있는데, Git repo를 clone할 때마다 local에서 설정해 주는 방법과, .gitconfig에서 설정해 주는 방법이 있다. 전자의 방법은 귀찮을 뿐더러 나중에 헷갈릴 수 있기 때문에 해당 내용은 생략하고 후자의 방법만 설명하도록 하겠다.
먼저, ~/.gitconfig을 생성하여 아래와 같이 추가해 주자.
[user]
name = <YOUR-NAME>
email = <YOUR-GIT-EMAIL>
[includeIf "gitdir:~/works/"]
path = .gitconfig-works
git config --global을 이용하였다면 [user]의 name과 email은 설정되어 있을 것이다. 여기서는 기본으로 쓰는 Git 계정을 기본으로 하되 ~/works/ 폴더 내부에 있는 repo에 한하여 다른 계정으로 연결하고자 하는 경우를 예시로 들고자 한다.
path = .gitconfig-works를 선언해 주었으므로 똑같이 ~/.gitconfig-works를 생성하여 아래와 같이 추가해 주자.
[user]
name = <YOUR-NAME>
email = <YOUR-GIT-EMAIL>
이후 저장하면 모든 설정이 끝나게 된다.
혹시 모르니 설정한 폴더의 내부/외부에 각각 Git repo를 하나씩 clone한 다음 git config user.email을 입력해 보도록 하자. includeIf에서 ~/works/로 설정하였으므로 works에서는 user.email이 global email로 뜨게 되고 works 내부의 repo 폴더가 생성된다면 해당 폴더 내부에서는 따로 설정한 email이 뜨게 된다.
마치며
이거 하려고 한 시간 가까이 삽질한 내가 레전드다 ㅋㅋ
'공부 > Git' 카테고리의 다른 글
GitHub을 이용한 React 프로젝트 배포하기 (0) | 2022.11.24 |
---|---|
Git으로 협업하기(fork 후 upstream과 동기화) (0) | 2022.02.19 |