개발/Developing

[Git] 작업 환경 분리 - 저장소별 SSH Key 사용하기

lazykuna 2022. 3. 2. 13:58

회사에서 Git을 쓰게 되었는데, 작업환경 특성상 personal account 대신 company account를 새로 만들어서 작업을 하게 되었다.

그런데 나는 개인적인 용도로도 Git을 사용하고 있어서, 개인 계정으로도 작업할 수 있어야 했다. 정리하면 아래와 같은 상황이었다.

  • 내 메인 Git ID(kuna)에는 SSHkey1, 업무용 Git ID에는 SSHkey2가 등록되어 있음
  • 일반적인 경우 개인 Git repository로 작업할 거고, 이 경우 SSHkey1을 사용하여야 함
  • 업무용 Git repository들은 http://github.com/company_name/... 형태의 URL을 가지고 있고, 이것들은 SSHkey2로 인증되어야 함.

이러한 상황에서 세팅을 어떻게 할 지 찾아보다가 좋은 글이 있어서 포스트로 옮겨 써 놓는다.

1번째 방안 — 별도의 Host 만들기

  1. 각 계정별로 SSH 키를 준비해서, Git ID에 등록합니다.

  2. git config를 수정하여, 특정 URL에 대해서 host를 redirect 할 수 있도록 한다.

     # git@github.com 대신 git@github-company를 보도록 한다. 즉, hostname을 바꾼다.
     # 밑의 ssh config에서 특정 hostname에 대해 redirect 및 keyfile 설정을 해주기 위한 선행작업
     git config --global 'url.git@github-company:company_name.insteadOf' 'https://github.com/company-name'
  3. SSH Config file을 아래와 같이 수정합니다 (~/.ssh/config)

     # Default github account: oanhnn
     Host github.com
        HostName github.com
        IdentityFile ~/.ssh/oanhnn_private_key
        IdentitiesOnly yes
    
     # Other github account: superman
     Host github-company
        HostName github.com
        IdentityFile ~/.ssh/superman_private_key
        IdentitiesOnly yes
  4. SSH key를 등록합니다. ssh-keygen 쓰면 알아서 등록 되는 듯?

     $ ssh-add ~/.ssh/oanhnn_private_key
     $ ssh-add ~/.ssh/superman_private_key
  5. 연결이 실제로 잘 되는지 테스트

     $ ssh -T git@github.com
     $ ssh -T git@github-company

    정상적으로 세팅이 되었다면, ssh 연결이 잘 수행되어 아래와 같은 메시지를 볼 수 있습니다.

     Hi oanhnn! You've successfully authenticated, but GitHub does not provide shell access.
  6. 이제 Git으로 필요한 작업을 하면 됩니다. (clone, ...)

     git clone https://github.com/company_name/repo
     git clone git@github-company:company_name/repo.git

한계점?

이 방식으로는 Hostname(또는 git user)에 따른 유저(SSH key) 분리 정도밖에 하기 어렵습니다.

repo마다 다르게 GPG 서명까지 해야 한다고 하면, 이 방식으로는 하기 힘들어 보입니다.

2번째 방안 — 폴더별로 다른 .gitconfig 사용하기

이는 Git 2.13 이후로 지원하는 includeIf 기능을 사용하면 가능합니다.

[includeIf "gitdir:~/company_a/"]
  path = ~/.gitconfig-company_a
[includeIf "gitdir:~/company_b/"]
  path = ~/.gitconfig-company_b

경로에 따라 적절하게 repository와 gitconfig을 가져다 놓으면 설정 분리가 쉽게 됩니다.

개인적으로는, 이쪽이 더 직관적인 것 같습니다.

출처