태그 보관물: git

Emacs: Buffer is read-only

원격 서버에 접속해서 개발을 마치고 커밋을 정리하려고 git rebase -i <base_commit>를 하는데 “Buffer is ready-only”가 뜨면서 rebase를 수행할 수 없는 문제가 생겼다.

로컬에서 사용하는 Emacs에서는 이런 문제를 겪은 적이 없었는데 원격 서버에서는 git-rebase-todo 버퍼를 읽기 전용으로 읽어 버리는 문제가 생기는 것이다. 이 문제를 해결하는 방법은 두가지 정도가 있다.

방법1: Read-only 강제 전환

특별한 문제가 있어서라기 보다는 모종의 이유로 special mode가 활성화 되어서 read-only가 걸린 상태가 되는 것일 뿐이므로 C-x C-q로 쓰기모드로 강제 전환해서 수정을 해도 별 문제가 없다. 다만, 이후로도 git rebase -i 명령어를 수행할 때 마다 강제 전환을 해줘야 한다는 사소한 문제가 있을 뿐.

방법2: git-rebase-mode-hook 설정

매번 버퍼를 강제 변환하는 과정을 귀찮으니 아예 git rebase mode일 때 read-only를 강제로 푸는 방법도 있다. init file의 뒷쪽에 다음을 추가해 준다.

...

;; git rebase를 수행할 때 read-only 걸리는 문제 수정
(add-hook 'git-rebase-mode-hook
  (lambda ()
    (read-only-mode -1)))

SSH Permission denied (publickey)

주로 시스템을 설정하는 초기에 발생하는 문제인데 private key가 제대로 있고 file permission도 잘 설정 되어 있음에도 ssh 접속을 시도하면 권한 오류가 발생하는 경우가 있다.

$ ssh -T git@github.com
git@github.com: Permission denied (publickey). 

해결하는 방법은 사용하려는 private key를 ssh-add 명령어를 이용해서 ssh-agent에게 추가해 주는 것인데, 만약 ssh-agent가 동작하지 않는 상태라면 이 동작에도 오류가 발생한다.

$ ssh-add ~/.ssh/my_private_key 
Could not open a connection to your authentication agent.

이와 같은 인증 agent 관련한 문제가 생길 때는 ssh-agent를 실행해서 나오는 결과물을 화면에 붙여 넣으면 된다.

# SSH-agent를 실행하면 환경변수 값들이 화면에 출력된다.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-GWQEJqNDZHsI/agent.3260; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3261; export SSH_AGENT_PID;
echo Agent pid 3261;

# 이것들을 그대로 화면에 붙여넣고
$ SSH_AUTH_SOCK=/tmp/ssh-GWQEJqNDZHsI/agent.3260; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3261; export SSH_AGENT_PID;
echo Agent pid 3261;
Agent pid 3261

# ssh-add를 시도한다.
$ ssh-add ~/.ssh/my_private_key 
Identity added: /home/litcoder/.ssh/my_private_key (/home/litcoder/.ssh/my_private_key)

그런데 복붙하는 건 너무 번거로우니까 eval command를 사용해서 ssh-agent의 결과물을 그대로 수행하도록 하면 복붙한 것과 동일한 효과를 낼 수 있다.

$ eval `ssh-agent`
Agent pid 4416

$ ssh-add ~/.ssh/my_private_key 
Identity added: /home/litcoder/.ssh/my_private_key (/home/litcoder/.ssh/my_private_key)

매번 로그인 할 때 마다 반복 하는 건 귀찮으니까 .bashrc 같은곳에 넣어두자.

#.bashrc
...
eval `ssh-agent`
ssh-add ~/.ssh/my_private_key

다시 로그인해서 시험해보면 permission error가 없이 잘 실행되는 걸 볼 수 있다.

$ ssh -T git@github.com
Hi litcoder! You've successfully authenticated, but GitHub does not provide shell access.

Firewall 바깥의 git을 clone하기

Firewall등이 막고 있어서 외부의 git repository를 HTTPS로는 clone할 수 있지만 SSH로는 막히는 경우가 있다. 특히나 GitHub의 two-factor authentication을 설정한 경우라면 매번 token값을 입력하는 것 때문에 commit을 push하는게 매우 귀찮아진다.

이 문제는 ssh config file에 Proxy command를 설정해서 해결할 수 있는데
${HOME}/.ssh/config에 다음과 같이 추가해 주고, credential caching을 설정해 준다. (-S option에는 SOCKS port를 설정해야 함)

Host GitHub.com
  HostName github.com
  User git
  Port 22
  PorxyCommand connect-proxy -S {proxy-server}:{socks-port} %h %p