다른 에디터를 연다고 해서
쉘(터미널)이 다른 것이 아님
회사에서는 WebStorm을 쓰고 있고, github desktop app을 사용하고 있어서
구분을 위해서 개인 공부나 프로젝트는 vscode로 작업하려고 하는데
permission denied를 맥이길래
본 김에 정리해보았다.
다른 블로그를 통해서 설정을 했고,
거기에 추가해서 알면 좋을 사항을 적어본다
- ssh key 생성 및 등록(local config 파일, github setting)
- gitconfig user, host 설정
+(mac) keychain access
+osxkeychain
+터미널(shell)
github레포지토리 페이지에 들어가면 clone하기 위한 https 주소와 ssh 주소 2가지 타입이 있는 걸 볼 수 있다.
ssh 프로토콜을 이용해서 public key(.pub)를 github에 등록하고, (private은 로컬에서만 지니고 있음) 매번 접속할 때마다 username 이나 password를 입력하지 않아도 되는 접속 방식이다.
- ssh key 생성
- ssh key 등록 (ssh-agent/로컬)
- ssh key github 등록
- .ssh config, .gitconfig 설정파일 일치 확인
*github가 제공하는 공식 문서를 보는 것이 좋은 것 같다. 키보드도 돌고 돌아 결국 끝판왕을 사게 되는 것처럼.
(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]
(d) ssh-agent 등록
ssh-add -K ~/.ssh/id_rsa_어쩌구
* -K
와 같은 옵션은 ssh-agent에 ssh key에 대한 암호(passphrase) 입력 여부와 관련된 플래그이다.
(e) 회사 계정, 개인 계정 등 멀티 account를 쓰고 싶다면 (a)~(d) 과정을 각각 2번 진행
github 각 계정 settings > ssh key 항목에서 public key를 복사&붙여넣어 등록한다.
(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-add -T ~/.ssh/암호키파일명
를 입력하면 터미널에
Hi username! You've successfully authenticated, but GitHub does not provide shell access.
이런 응답을 볼 수 있다면 등록된 것, 하지만 shell access는 없다..!
(-T
플래그가 terminal access를 제외한다는 옵션이었다..)
(에디터별로 계정 연결은 할 수 있으나, 터미널은 별개임을)
에러 확인:
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 public key를 접근할 서버(github, gitlab, bigbucket)에 등록하여 인증하는 방법은 비밀번호 입력없이 로그인 하는 방법으로 많이 사용되며, 이 서비스들은 ssh 프로토콜에서 모두 같은 ID(git)로 접속하되 공개키를 다르게 하여 실제 사용자를 구별한다.
ssh로 해당서비스를 접근할 때 사용자 이름을 git 으로 하면, 서비스에 가입한 ID를 화면에 출력하고 바로 접속을 끊는다.
아!
Hi JIYEONGYANGdev! You've successfully authenticated, but GitHub does not provide shell access.
요 문구 나오는 게 정상이구나.
참고🔗 블로그
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.
계정 소유자를 불러오는 데 실패했다고 한다..
본인은 mac Pro M1을 사용 중이고, mac os는 인증정보를 keychain access 에 저장한다.
ssh key 같은 경우 또한 git에서 매번 유저 계정을 확인(password입력, 계정정보 주소별로 cli입력 등)하는 번거로움이 없도록 인증정보를 저장하는 것이다.
참고🔗 블로그
공식문서🔗 credential storage- custom
push, pull 등 어떤 key를 사용했는지 확인해보자
참고🔗 블로그
.gitconfig
설정두번째 결론아닌 결론은
github desktop app 과 같은 GUI를 이용해서 local repository 마다 계정을 정해주는 게 보다 명확할 것 같다.
.gitconfig (Global)에 글로벌 계정을 설정해두고,
.gitconfig-personal 등 다른 gitconfig를 볼 수 있도록 includesIf 등의 옵션을 global .gitconfig 파일에 명시해두면 될 것 같다.
본인은 헷갈려서 결국
개인 git 계정을 터미널에서 사용하도록 global 로 개인계정을 global로 설정해두었고,
gui(github desktop app)로 회사계정을 쓰기로 했다..^^
- 로컬 디렉토리 를 나누어 gitconfig를 관리
- global .gitconfig 설정하고,
개별 계정을 [includeIf] 옵션? 으로 추가함- 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 이다.
정리하자면,
ssh-add --apple-use-keychain ~/.ssh/<personal_key_file_name>
)개인 계정으로 리모트 repo에 push 하고 싶어서 다시 찾아보고 해결을 시도하게 되었다.
2일 전 커밋을 오늘 push 해냈다.
*회사 계정 개인 레포지토리 push나 clone 등의 경우도
예를 들어
내 repository의 ssh 주소를 복사해서 ssh config host 에 맞게
github.com-company:JIYEONGYANGdev/~repository.git
등 주소로 수정해서 remote url을 등록해야 함!
=> 근데 또 이번엔 개인 계정으로 회사계정에 커밋을 한 셈이 됨
to be continued...
터미널에서 나의 개인 레포지토리에 push 되는 걸 확인하고 나서
회사 계정을 등록한 디렉토리로 옮겨가 테스트 레포를 clone 후 수정,commit, push 진행해보았을 때 또 개인계정으로 Push가 되었었다.
ssh-add --apple-use-keychain ~/.ssh/<personal_key_file_name>
git config --get user.email
커맨드 입력으로 내가 의도한 git 계정이 맞는지 확인git config user.email <내가의도한계정이메일>
결론적으론, 계정을 옮겨다닐 때(터미널 상에서 속한 계정이 다른 디렉토리로 이동할 때)는 해당 디렉토리에서 다시 한번 git 계정을 확인하는 것이 좋겠다!
적어도 ssh key를 크로스로 등록하거나, git config 상 host 등을 제대로 구분했다면
회사 레포지토리에는 개인 계정으로 Push될 일이 없도록 할 수 있을 것.