이전 글(첫번째, 두번째)에서 윈도우에서 git clone이 멈추는 문제를 다뤘다. 첫번째는 자격 증명 문제였고, 두번째는 HTTPS로 받은 다음 SSH로 바꾸는 방법이었는데 이건 사실 우회였다. 이번에 원인을 찾았다.

 

증상은 이렇다. git clone https://github.com/... 으로 받으면 500MB 가까운 저장소도 수십 초면 받는데, 같은 저장소를 git clone git@github.com:... 으로 받으면 에러도 없이 그냥 멈춘다. Receiving objects 가 뜨기 직전에 멈추고 더 진행이 안된다. 당황스러운 건 ssh -T git@github.com 하면 인증은 잘 되고, 크기가 작은 저장소는 SSH로도 잘 받아진다는 것이다. 그래서 처음엔 네트워크 문제인 줄 알고 VPN도 꺼 보고, 핫스팟으로도 받아 보고, 443 포트로도 해 봤는데 다 똑같았다.

 

원인은 깃이랑 같이 깔리는 ssh였다. 윈도우에는 ssh.exe가 두 개 있다. 하나는 Git for Windows에 딸려 오는 것(C:\Program Files\Git\usr\bin\ssh.exe)이고, 다른 하나는 윈도우에 내장된 OpenSSH(C:\Windows\System32\OpenSSH\ssh.exe)다. 깃은 기본으로 자기한테 딸린 ssh를 쓰는데, 이게 큰 데이터를 받을 때 멈추는 것으로 보인다. 내 경우 깃에 딸린 건 OpenSSH 9.9p1, 윈도우 내장은 9.5p2였다.

 

확인은 ssh만 바꿔서 같은 저장소를 받아 보면 된다. Git Bash에서,

# 깃에 딸린 ssh (기본)
git clone --depth 1 git@github.com:cvat-ai/cvat.git testA

# 윈도우 내장 ssh
GIT_SSH_COMMAND='C:/Windows/System32/OpenSSH/ssh.exe' git clone --depth 1 git@github.com:cvat-ai/cvat.git testB

내 경우 첫번째는 77KB 받고 멈췄고, 두번째는 14초 만에 다 받았다.

 

해결법은 깃이 윈도우 내장 ssh를 쓰도록 설정하는 것이다.

git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"

키나 ~/.ssh/config 는 두 ssh가 같은 곳을 보기 때문에 따로 손댈 건 없다. 되돌리려면 아래 명령어를 쓰면 된다.

git config --global --unset core.sshCommand

깃이 실제로 어떤 ssh를 부르는지 궁금하면 명령어 앞에 GIT_TRACE=1 을 붙여서 실행해 보면 나온다.

Posted by 공돌이pooh
,