https://github.com/left21wm/dev-sharing/blob/master/git/02-remote-repo,checkout.md
원격 저장소를 생성하려면, 서버로 사용할 컴에서 작업을 해야 한다.
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
라는 옵션을 줘야 한다. 이게 원격 저장소를 만드는 옵션이다.
git clone --bare /git-repos/my-project /git-repos/my-project.git
이러면 원격 저장소 생성 완료.
아, 내 컴에 원격 저장소를 만든 다음 그걸 서버컴으로 통째로 복사해 옮기는 것도 방법이다.
--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
을 하면 된다.
git clone left21wm@192.168.0.100:/git-repos/my-project.git
이럼 끝이다. 이렇게 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 안에 있는 작성자가 변경되지는 않는다는 말이다.
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 명령어만 사용할 수 있도록 설정을 하려면 아래 절차를 따른다. 일단, Server컴에 들어가서, git-shell
이 어디에 있는지 찾는다. 아래 명령어로 찾으면 된다.
which git-shell
which
는 전역에서 사용하는 명령어의 실제 위치를 알려 주는 명령어다. 내 우분투 서버는 이런 결과를 출력한다.
/usr/bin/git-shell
자, 이걸 기억해 놓고 다음으로 넘어가자. 이렇게 치자.
sudo mkdir /home/git/git-shell-commands
sudo chown git:git /home/git/git-shell-commands
위 명령어는 git-shell
을 활성화하기 위해 필요한 폴더를 만들고 해당 폴더를 git 계정 것으로 만드는 명령이다. (물론 git 계정으로 로그인해서 폴더를 만들면 권한 부분은 신경 안 써도 된다.)
이제 git-shell
을 쓸 준비가 됐으니, git 계정이 사용할 쉘을 git-shell
로 바꾸는 작업을 하자.
아래 명령어로 사용자 계정 문서로 들어간다.
sudo nano /etc/passwd
보통 터미널 에디터로 vim을 쓰던데, 터미널 세대가 아닌 나는 nano가 더 편하더라. 여튼간에 자신이 편한 에디터를 사용하면 된다.
그리고 다음과 같이 git:
로 시작하는 줄을 찾는다.
git:x:1000:1000::/home/git:/bin/bash
마지막 줄의 /bin/bash
가 해당 계정이 사용할 쉘 프로그램을 명시해 주는 부분인 거 같다. 이 부분은 사용하는 시스템마다 다르니까 이 부분이 다르다고 당황해 하지는 말자. 《Pro Git》의 예제에는 이 부분이 /bin/sh
라고 나온다.
자, 이제 이 부분을 아까 which git-shell
해서 나왔던 결과로 교체해 준다. 나 같은 경우는 /usr/bin/git-shell
이라고 나왔으니까 그렇게 바꿨다. 여튼 그래서 결과적으로 위의 줄은 아래처럼 바뀔 것이다.
git:x:1000:1000::/home/git:/usr/bin/git-shell
이제 저장하고 나온 다음 아래 명령어로 git 계정에 접속해 보자.
su git
아마도 결과가 버전에 따라 다른 것 같은데, 두 가지 경우 모두 성공이다. 내가 테스트해 본 버전이 두 개고, 굳이 변천사 같은 걸 찾아 볼 필요는 없는 것 같아서 테스트한 버전만 적는다.
git>
라고 표시되면 성공! 한 번 ls
명령어를 쳐 보자. unrecognized command 'ls'
라고 나온다면 확실히 성공인 거다.
fatal: What do you think I am? A shell?
이런 메세지가 나오고 로그인이 안 된다. 해석하면, "치명적 오류: 내가 쉘이라고 생각하니?" 정도 되겠다. 역시 이런 메세지가 나와도 성공이다.
ssh의 기본 포트는 22다. 그런데 보안 때문에 22번 포트를 사용하지 않는 경우도 있다. 그런 경우엔 아래처럼 사용하면 된다. 포트를 52222번을 사용한다고 가정하자.
git clone ssh://git@192.168.0.100:52222/git-repos/my-project
이러면 된다. 포트가 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
에서도 사용하는데, 여기선 패스.)
갑자기 좀 쌩뚱맞지만 몇 가지 명령어를 SVN과 비교해서 정리하면 이렇다.
checkout
: clone
update
: pull
revert
: checkout
commit
: push
Designed by sketchbooks.co.kr / sketchbook5 board skin
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5