SVN은 흔히들 저장소 하나를 만들고 각 폴더를 한 프로젝트로 사용했을 거다. git는 그럴 필요가 없다. 그냥 프로젝트 하나를 저장소 하나로 만들면 된다.
빈 원격 저장소 생성하기
비어 있는 원격 저장소를 생성한 다음, 로컬 컴퓨터에서 clone 받고 push를 하면서 시작하는 것도 방법이다. 그렇게 하려면 원격 프로젝트 저장소로 사용할 폴더로 가서 이렇게 --bare라고 옵션을 붙여서 명령을 내리면 된다. 원격 저장소로 사용할 폴더는 관례상 .git라는 접미사(suffix)를 붙인다. 알아 두자.
git --bare init
그러면 그 폴더가 원격 저장소가 된다. 접속을 어떻게 하는지는 뒤에서 다룬다.
이미 있는 프로젝트를 원격 저장소로 만들기
일단 원격 저장소를 둘 Server컴에 .git 폴더 없이 소스만 다 복사하든가, 아니면 로컬에 있는 git 저장소를 통째로 Server컴으로 복사를 뜬다. clone을 하든, .git까지 포함해서 scp를 하든 소스만 복사를 뜨든 뭐 알아서 하란 말이다. 물론 소스만 복사를 뜨면 기존 git commit history는 날아가 버리는 거겠지만.
복사 뜬 프로젝트가 git 저장소가 아니라고 가정하자. 그럼 우선 git 저장소로 만들어 줘야 한다. git init이라고 쳐서 저장소로 만들고, .gitignore에 무시할 파일들을 적어 주고, git add . 명령으로 모든 파일과 폴더를 git에 추가한 다음, git commit -a 명령으로 추적을 시작하자. 이러면 준비완료다.
만약 서버에 카피뜬 저장소가 이미 git 저장소라면 앞의 과정은 생략해도 되겠다.
여튼 방금 복사 뜬 서버쪽 저장소의 위치가 /git-repos/my-project라고 치자. 그럼 어떻게 할까? 일단 원격 저장소로 만들 폴더를 만든다.
mkdir /git-repos/my-project.git
이렇게 치면 폴더가 만들어지고... 다음으로 그냥 clone을 뜨면 된다. 단, 아래 명령어를 보면 알 수 있겠지만, --bare라는 옵션을 줘야 한다. 이게 원격 저장소를 만드는 옵션이다.
아, 내 컴에 원격 저장소를 만든 다음 그걸 서버컴으로 통째로 복사해 옮기는 것도 방법이다.
--bare - 벌거벗은 저장소
원격 저장소와 로컬 저장소의 차이는 working copy를 갖고 있냐 없냐밖에 없다. 로컬 저장소의 .git 안에 있는 것들이 원격 저장소에선 밖으로 나와 있다. 그뿐이다. 그래서 bare, 벌거벗은 저장소인 거다.
원격 저장소 접속
와우 원격 저장소를 만드는 게 이렇게 쉽다니. SVN에 비해서 스트레스가 훨씬 적다. SVN은 저장소마다 인증 문제를 처리해야 해서 상당히 귀찮았단 말이다. 그런데 git는 ssh로 다 처리해 버리니, 저장소 그 자체를 만드는 게 상당히 간결해진 것 같다. 여튼, 저장소 로그인 문제는 뒤에 다루고 이번엔 어떻게 원격에서 접속할 것인지를 다룬다.
원격 저장소로 접속하는 방법은 다양하다. git는 http, https, git, ssh 프로토콜을 지원한다. 자세한 내용은 《Pro Git》을 참고할 것을 권한다. 여기서는 소규모 비공개 작업 팀에게 적합하다고 생각되는, ssh 접속만 다룬다.
아까 /git-repos/my-project.git를 Sever컴에 만들었다고 치자. Client컴은 여기에 어떻게 접속해야 할까? Server컴엔 원래 ssh로 접속할 수가 있었다고 가정하자. ssh 접속용 ID는 left21wm이라고 하자. 그리고 Server컴은 소규모 팀답게 IP가 192.168.0.100이다. 그러면 Client컴 쪽에서 아래처럼 clone을 하면 된다.
이럼 끝이다. 이렇게 clone을 해왔다면, 그 다음부턴 지난 세미나때 배웠던 것처럼 git add .과 git commit으로 로컬에 작업 내역을 저장하고 git push origin master 명령어로 서버와 통신하면서 작업을 하면 끝이다.
팀원 모두가 left21wm 아이디로 접속한다고?
그렇다. left21wm 아이디로 팀원 모두가 접속하면 된다. 어차피 git commit은 내 컴퓨터에 내 자격증명을 바탕으로 하는 것이다. 내 자격증명은 첫 번째 세미나에서 git config --global user.name "myname"와 git config --global user.email "mymail@email.com"로 했었다. commit한 사람은 바로 이 자격증명으로 기록된다. 어디에? 내 컴퓨터의 저장소에 말이다.
git push를 하게 되면 내 컴에 기록된 commit history를 서버 컴에 밀어넣게 된다. commit한 사람의 이름이 바뀌지는 않는다. ssh 접속은 원격 git 저장소에 로그인하는 게 아니라, 원격 Sever컴에 로그인하는 것이다. Sever컴에 로그인한 다음 git commit history를 push하는 것이다. jpg를 카피한다고 jpg 안에 있는 EXIF 태그가 변경되는 게 아닌 것처럼, git를 push한다고 git commit history 안에 있는 작성자가 변경되지는 않는다는 말이다.
평소에 사용하는 ssh 계정을 사용해도 되지만 git 전용 계정을 만드는 것도 좋다
Server컴에 git 전용 계정을 만들고, 해당 계정은 git 명령어만 사용할 수 있도록 설정하는 것은 보안에 도움이 될 것이다. 사용자를 만드는 방법은 다음과 같다.
sudo adduser git
이 명령 내리면 패스워드 입력하라고 나온다. 그건 입력하면 되고. Full Name도 입력하라고 한다. 뭐 대충 입력해 준다. 그런데 갑자기 룸 넘버 묻고 전화번호 묻고 막 이런다. 룸 넘버부터는 그냥 다 엔터치면 된다. 성실히 적고 싶으면 적든가.
여튼 이렇게 터미널에서 사용자를 만드는 건 무지하게 쉽더라.
물론 저장소의 소유자를 방금 만든 저 git 계정으로 돌리는 걸 잊지 말기 바란다.
sudo chown -R git:git /git-repos
만약 git 계정이 /git-repos 폴더에 읽기 권한만 있고 쓰기 권한이 없다면 쓰기는 할 수 없게 된다. ssh로 간단한 권한 조정은 이렇게 할 수 있는 것이다. git 계정은 읽기 쓰기를 다 할 수 있도록 설정하고, git-readonly 같은 계정을 또 만들어서 저장소를 읽기만 할 수 있게 해 두는 식으로 말이다.
자, 여튼간에 그러면 앞으로는 Client컴에서 이렇게 clone하면 되겠다.
git clone git@192.168.0.100:/git-repos/my-project
git 계정은 git 명령어만 사용할 수 있도록 해볼까
git 명령어만 사용할 수 있도록 설정을 하려면 아래 절차를 따른다. 일단, Server컴에 들어가서, git-shell이 어디에 있는지 찾는다. 아래 명령어로 찾으면 된다.
which git-shell
which는 전역에서 사용하는 명령어의 실제 위치를 알려 주는 명령어다. 내 우분투 서버는 이런 결과를 출력한다.
이러면 된다. 포트가 22번이 아닌 경우엔 앞쪽에 ssh://라고 프로토콜을 밝혀 줘야 하더라.
Client컴에서, 내 git 저장소가 어느 원격 저장소에 연결돼 있는지 보려면 아래처럼 써 준다.
git remote -v
그럼 쭉 나온다. 뭐 사실 기본적으로 git help라고 치면 git 명령어 바로 다음에 칠 수 있는 명령어들이 나오고, git help remote하는 식으로 치면 해당 git 명령어를 사용하는 방법이 상당히 자세히 나오니까 궁금한 거 있으면 그냥 help 쳐 보면 된다.
소스 되돌리기
SVN에서 checkout은 원격 저장소에 있는 것을 최초로 받아 오는 것이다. update는 원격 저장소와 자신의 working copy를 합치는 것이고, revert는 원격 저장소의 것으로 내 working copy를 되돌리는 것이다.
git에서는 최초로 원격 저장소에 있는 것을 받아 오는 것은, clone이다. 한 working copy를 받아 오는 게 아니라 저장소를 통으로 복사해 오기 때문에 clone이란 표현이 적절해 보인다. 그리고 pull이 원격 저장소 (개념을 좀더 쉽게 하기 위해 내 멋대로 말을 만들면, '다른 저장소')에 있는 것을 '땡겨' 와서 내 저장소와 합치는 것이고, checkout은 원격 저장소로 내 저장소를 덮어 쓰는 것이다. (checkout은 branch에서도 사용하는데, 여기선 패스.)