로컬에서 github 계정 2개 쓰기

수툴리 양·2022년 2월 12일
0

TIL(2)

목록 보기
5/8

다른 에디터를 연다고 해서
쉘(터미널)이 다른 것이 아님

회사에서는 WebStorm을 쓰고 있고, github desktop app을 사용하고 있어서

구분을 위해서 개인 공부나 프로젝트는 vscode로 작업하려고 하는데

permission denied를 맥이길래

본 김에 정리해보았다.

다른 블로그를 통해서 설정을 했고,
거기에 추가해서 알면 좋을 사항을 적어본다

  • ssh key 생성 및 등록(local config 파일, github setting)
  • gitconfig user, host 설정
    +(mac) keychain access
    +osxkeychain
    +터미널(shell)

ssh-key

github레포지토리 페이지에 들어가면 clone하기 위한 https 주소와 ssh 주소 2가지 타입이 있는 걸 볼 수 있다.
ssh 프로토콜을 이용해서 public key(.pub)를 github에 등록하고, (private은 로컬에서만 지니고 있음) 매번 접속할 때마다 username 이나 password를 입력하지 않아도 되는 접속 방식이다.

  1. ssh key 생성
  2. ssh key 등록 (ssh-agent/로컬)
  3. ssh key github 등록
  4. .ssh config, .gitconfig 설정파일 일치 확인

*github가 제공하는 공식 문서를 보는 것이 좋은 것 같다. 키보드도 돌고 돌아 결국 끝판왕을 사게 되는 것처럼.

| generate ssh key

(a)

  ssh-keygen -t ed25519 -C "your_email@example.com"
  ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

*ed25519, rsa 등은 암호화 알고리즘이다.


(b) 다음과 같이 ssh key file이 생성된 위치의 경로, 암호파일명을 확인하고 파일명을 수정할 수 있다.

Generating public/private rsa key pair. Enter file in which to save the key (/Users/<yourpc>/.ssh/<id_rsa 커스텀가능_>):

(c) password 설정. *그냥 return키(⏎)를 치면 빈 값으로 들어간다.

Enter passphrase (empty for no passphrase): [Type a passphrase]
Enter same passphrase again: [Type passphrase again]

| ssh-agent 등록

(d) ssh-agent 등록

  ssh-add -K ~/.ssh/id_rsa_어쩌구

* -K 와 같은 옵션은 ssh-agent에 ssh key에 대한 암호(passphrase) 입력 여부와 관련된 플래그이다.


(e) 회사 계정, 개인 계정 등 멀티 account를 쓰고 싶다면 (a)~(d) 과정을 각각 2번 진행


| github ssh key 등록

github 각 계정 settings > ssh key 항목에서 public key를 복사&붙여넣어 등록한다.


| config 설정

(g) ~/.ssh/config 설정
config는 configuration, 설정 파일이며 없으면 touch 등 명령어로 생성하면 된다.
nano 커맨드로 config 내용을 편집 가능하다.

#company
Host company-github.com *로컬에서 git init 후 remote 레포지토리 연결 시 ssh 주소를 이렇게 바꾸어야 함
HostName github.com
User git
  AddKeysToAgent yes
  UseKeychain yes  *이 옵션을 삭제하면 터미널에서 push할 경우 등에서 암호 입력을 요구하지 않음
  IdentityFile ~/.ssh/id_ed25519

#personal
Host personal-github.com
HostName github.com 
User git *로컬에서 git init 후 remote 레포지토리 연결 시 ssh 주소를 이렇게 바꾸어야 함
  IdentityFile ~/.ssh/id_personal

*참고로 ~/.ssh 는 숨겨진 디렉토리로 최상위 루트에 존재함


(g) ~/.gitconfig 설정

[user]
	name = <username아무거나>
	email = <github계정 이메일>

ssh 주소를 보면 User@HostName:user.name/repositoryName.git 의 형식을 이루고 있다


| ssh 키가 등록되었는지 확인

ssh-add -T ~/.ssh/암호키파일명를 입력하면 터미널에

Hi username! You've successfully authenticated, but GitHub does not provide shell access.

이런 응답을 볼 수 있다면 등록된 것, 하지만 shell access는 없다..!
(-T 플래그가 terminal access를 제외한다는 옵션이었다..)


| Error

(에디터별로 계정 연결은 할 수 있으나, 터미널은 별개임을)

에러 확인:

ERROR: Permission to userA.name/test.git denied to userB.name.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

로컬에서 작업 후 push 시 이런 에러를 발견했다면, 계정 간 충돌이 일어난 것이다.
회사계정-개인계정 간 크로스로 commit 및 push를 해도 상관 없다면 ssh-key를 하나씩 더 만들어 서로 추가해도 될 것이다.

.gitconfig-personal 등 개별 설정파일을 생성하여 global config 파일에 명시해주는 방법도 있다.
(참고 🔗 블로그)

결론적으로 본인은 회사업무는 github desktop app 에 로그인 고정되어 있으니 그걸로 작업하고, 로컬에서는 shell cli를 사용하려 했는데

로컬 global이 회사 계정으로 되어 있는 듯하다 ..^^
.
.
.
to be continued..


🌞


| ssh 접속

ssh public key를 접근할 서버(github, gitlab, bigbucket)에 등록하여 인증하는 방법은 비밀번호 입력없이 로그인 하는 방법으로 많이 사용되며, 이 서비스들은 ssh 프로토콜에서 모두 같은 ID(git)로 접속하되 공개키를 다르게 하여 실제 사용자를 구별한다.

ssh로 해당서비스를 접근할 때 사용자 이름을 git 으로 하면, 서비스에 가입한 ID를 화면에 출력하고 바로 접속을 끊는다.

아!

Hi JIYEONGYANGdev! You've successfully authenticated, but GitHub does not provide shell access.

요 문구 나오는 게 정상이구나.

참고🔗 블로그


회사 계정은 webstorm을 스니 sourcetree로 vscode를 쓰고, 개인 레포지토리를 쓰기 위해 sourcetree 로 다시 접근해봤다.(GUI를 쓰면 알아서 해주지 않을까라는 생각에..)

sourcetree에 개인 계정 연결을 했고, sourcetree 가 생성해준 public key (~/.ssh/config에도 자동 등록해줌) 를 해당 github계정에 등록해주었지만

gui를 통해 remote repository를 만드는 것에는 자꾸 실패했다.
error message was :
message: You need at least read:org scope or user scope to list your organizations.

계정 소유자를 불러오는 데 실패했다고 한다..


| credentials.helper (keychain)

본인은 mac Pro M1을 사용 중이고, mac os는 인증정보를 keychain access 에 저장한다.

ssh key 같은 경우 또한 git에서 매번 유저 계정을 확인(password입력, 계정정보 주소별로 cli입력 등)하는 번거로움이 없도록 인증정보를 저장하는 것이다.

참고🔗 블로그

공식문서🔗 credential storage- custom


push, pull 등 어떤 key를 사용했는지 확인해보자

참고🔗 블로그


| conditional inlcude로 특정 디렉토리만의.gitconfig 설정

두번째 결론아닌 결론은

github desktop app 과 같은 GUI를 이용해서 local repository 마다 계정을 정해주는 게 보다 명확할 것 같다.

.gitconfig (Global)에 글로벌 계정을 설정해두고,
.gitconfig-personal 등 다른 gitconfig를 볼 수 있도록 includesIf 등의 옵션을 global .gitconfig 파일에 명시해두면 될 것 같다.

본인은 헷갈려서 결국
개인 git 계정을 터미널에서 사용하도록 global 로 개인계정을 global로 설정해두었고,

gui(github desktop app)로 회사계정을 쓰기로 했다..^^

  1. 로컬 디렉토리 를 나누어 gitconfig를 관리
  2. global .gitconfig 설정하고,
    개별 계정을 [includeIf] 옵션? 으로 추가함
  3. conditional setting option 추가
    글로벌 .gitconfig 파일 내용에
[includeIf "gitdir:~/상위디렉토리/개별계정설정하고싶은디렉토리/"]
   path = ~/상위디렉토리/개별계정설정하고싶은디렉토리/디렉토리명.inc

추가

*gitdir: 은 glob 패턴을 따르는 문자열로, git directory 가 해당 패턴과 일치하면, path에 있는 파일을 include 한다.
.gitconfig 파일은 하위 디렉토리의 설정이 글로벌을 덮어쓰기 때문에 해당 경로의 파일에 특정 계정(user email, name) 설정해두면 덮어쓰여져 해당 설정을 사용하게 될 것이다.

여기까지 설정하여 각 디렉토리에서
git config --get user.email 를 입력하여 출력된 이메일이 알맞게 적용되어 있는지 확인할 수 있었다.

나는 터미널 각 디렉토리에서 다른 github 계정, 레포지토리를 쓰고 싶었던 것이라 이 config conditional 세팅이 필요했고,

gui 나 ssh 접속은 또 따로 확인해줘야할 것이다.

참고🔗 블로그


성공하다

여전히 터미널에서 git ssh접속이 원하는 계정으로 되지 않았다.

| credentials.helper, osxkeychain..
github.com 에 대한 keychain 이 등록되어 있었다. 회사계정의 access token이 등록되어 있었고, 이 때문에 ssh key가 먹히지 않은 건지는 확신할 수 없으나, 우선 github.com에 대한 키체인과 github 에서 access token을 삭제했다.

[참고] credentials.helper config 관련 🔗링크

[참고] https://ccambo.blogspot.com/2020/12/git-macos-githubcom.html

찾아본 바로 ssh key 로 접속하기 때문에 access token이 반드시 필요한 것 같지는 않았는데, 더 확인이 필요.
keychain 은 2개 이상 등록할 수 없을까?

| remote url 을 정확히 분리하여 입력
~./ssh config 에 host를 회사, 개인 계정용 다르게 등록하고
이를 remote url을 그에 맞게 수정해야 한다.
캡처에 표시한 형광 연두색 박스는 ssh config에 등록한 Host 이다.


정리하자면,

  1. github.com 에 대한 키체인 확인 & 삭제
    깃헙에서 access token 삭제
    *(이 계정만으로 쓸 것이 아니라 난 그렇게 진행해보았다. 두 계정에 각각의 ssh 키로 접속을 할 것이므로)
  2. ssh-key 생성
  3. 등록 (ssh-add --apple-use-keychain ~/.ssh/<personal_key_file_name>)
  4. ~./ssh config 설정 (host, hostName, ssh key path..)
  5. remote url 알맞게 등록 *!
  • git config 도 설정

개인 계정으로 리모트 repo에 push 하고 싶어서 다시 찾아보고 해결을 시도하게 되었다.
2일 전 커밋을 오늘 push 해냈다.

*회사 계정 개인 레포지토리 push나 clone 등의 경우도
예를 들어
내 repository의 ssh 주소를 복사해서 ssh config host 에 맞게
github.com-company:JIYEONGYANGdev/~repository.git 등 주소로 수정해서 remote url을 등록해야 함!

=> 근데 또 이번엔 개인 계정으로 회사계정에 커밋을 한 셈이 됨

to be continued...

결론 헷갈리면 다시 한번 config 등록

터미널에서 나의 개인 레포지토리에 push 되는 걸 확인하고 나서
회사 계정을 등록한 디렉토리로 옮겨가 테스트 레포를 clone 후 수정,commit, push 진행해보았을 때 또 개인계정으로 Push가 되었었다.

  1. ssh-add --apple-use-keychain ~/.ssh/<personal_key_file_name>
    (해도되고 안해도 되고.. 그냥 해봤다)
  2. (터미널) 해당 디렉토리에서 git config --get user.email 커맨드 입력으로 내가 의도한 git 계정이 맞는지 확인
  3. 다른 계정이라면 다시 한번 등록 해준다 (전역x 옵션 --global 제외)
    git config user.email <내가의도한계정이메일>

결론적으론, 계정을 옮겨다닐 때(터미널 상에서 속한 계정이 다른 디렉토리로 이동할 때)는 해당 디렉토리에서 다시 한번 git 계정을 확인하는 것이 좋겠다!

적어도 ssh key를 크로스로 등록하거나, git config 상 host 등을 제대로 구분했다면
회사 레포지토리에는 개인 계정으로 Push될 일이 없도록 할 수 있을 것.


[참고] 관련 🔗링크1 🔗링크2 🔗링크3

profile
developer; not kim but Young

0개의 댓글