팀 내에 전용 리눅스 서버를 설치하고, Samba로 파일 공유 설정하고, SSH설정 해주고 이러고 쓰고 있는데... 갑자기 GIT 을 쓸 일이 생겼네.
Github는 어떻게 이용해 보겠는데, 리눅스에 GIT Server 구축하는 건 왠지 잘 모르겠다고 생각해서, 한두번 검색해 본 다음 몇년간 쳐다도 안 보다가, 다시 보려니 왠지 복잡한 건... 으음...
인터넷으로 무언가를 검색하면, 정보가 잘 나오면 다행인데 항상 정보가 오래되어서 내용이 현재와 다르거나, 뭔가 한두개씩 빠지는 건 어쩔수 없는건가부다. 그래서 다들 자신들만의 정보를 남기기 위해 블로그를 하는 것이겠지...
구축 순서를 보면 대략 아래와 같아 보인다.
Ubuntu같은 표준 Linux 배포판을 사용한다고 가정한다.
사용자들은 아마도 authorized_keys 파일로 인증할 것이다.
ssh-copy-id 명령은 여기에서 설명하는 SSH 공개키를 복사하고 설치하는 작업을 자동화해 주는 도구이다.
먼저 git 계정을 만들고 사용자 홈 디렉토리에 .ssh 디렉토리를 만든다:
$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys
authorized_keys 파일에 SSH 공개키를 추가해야 사용자가 접근할 수 있다. 추가하기 전에 이미 알고 있는 사람의 공개키를 받아서 가지고 있다고 가정한다. 공개키가 어떻게 생겼는지 다시 한번 확인하자.
$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair
.ssh 디렉토리에 있는 authorized_keys 파일에 추가한다:
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys
--bare 옵션을 주고 git init 를 실행해서 워킹 디렉토리가 없는 빈 저장소를 하나 만든다.
$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/
--bare 옵션에 --shared 옵션까지 주면 여러 사용자가 공유하는 저장소를 만들 수 있다고 한다.
$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare --shared
Initialized empty Git repository in /srv/git/project.git/
이제 John, Josie, Jessica는 이 저장소를 리모트 저장소로 등록하고 나서 (각자의 계정으로) 브랜치를 Push 할 수 있다.
차이가 뭐냐면 ssh://git@gitserver/path/to/repo
하나로 여러 명이 같이 쓰느냐
John은 : ssh://john@gitserver/path/to/repo
Josie는 : ssh://josie@gitserver/path/to/repo
Jessica는 : ssh://jessica@gitserver/path/to/repo
처럼 각 사용자가 개별 접근 권한을 갖느냐라고 하는데, 이게 실제로 git 계정 하나로 돌려 써도 상관은 없다고(작성자가 다르게 들어간다고) 하더만...
프로젝트마다 적어도 한 명은 서버에 접속해서 Bare 저장소를 만들어야 한다.
git 계정과 저장소를 만든 서버의 호스트 이름이 gitserver 라고 하자.
만약 이 서버가 내부망에 있고 gitserver 가 그 서버를 가리키도록 DNS에 설정하면 아래와 같은 명령을 사용할 수 있다(MyGitProject 프로젝트가 이미 있다고 가정한다).
$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master
이제 이 프로젝트를 Clone 하고 나서 수정하고 Push 할 수 있다.
테스트용 폴더를 하나 생성해서 작업 해 보자
$ git clone git@gitserver:/srv/git/project.git
$ cd project
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master
<추가 정보>
# GIT 리포지터리에 ssh 프로토콜로 접근하기
$ git clone ssh://git@gitserver:/srv/git/project.git
# GIT 리포지터리에 ssh 프로토콜로 접근하기 - 포트번호 300번
$ git clone ssh://git@gitserver:300/srv/git/project.git
이 개발자들은 서버에 git 계정으로 로그인할 수 있다. 이를 막으려면 passwd 파일에서 로그인 셸을 바꿔야한다.
단순히 로그인 셸을 git-shell 로 바꾸기만 하면 git 계정으로는 git 만 사용할 수 있다. 이 로그인 셸은 서버의 다른 부분은 건들 수 없도록 돼있다. git-shell 을 사용자의 로그인 셸로 지정해야 한다. /etc/shells 에 git-shell 를 추가한다. 아래를 보자.
# 이미 `git-shell` 이 등록돼 있는지 확인
$ cat /etc/shells
# git-shell 실행파일이 설치돼 있는지 확인
$ which git-shell
# 바로 위 명령으로 확인한 git-shell 실행파일의 절대경로를 추가
# chsh <계정이름> -s <shell> 명령어를 이용해서 특정 계정의 셸을 바꿀 수 있다.
$ sudo vim /etc/shells
# git-shell 경로를 입력, 보통 /usr/bin/git-shell 임
# 이제 git 계정으로 Push 와 Pull 할 수 있지만 서버의 셸은 가질 수 없다.
# 로그인하려고 하면 아래와 같이 로그인 불가능 메시지만 보게 될 것이다.
$ sudo chsh git
$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.
이제 Git은 제대로 동작하면서 개발자들이 셸을 얻지 못하게 되었다.
위의 출력에서 볼 수 있듯이 git 계정의 홈 디렉토리에 git-shell-commands 디렉토리를 만들어 git-shell 의 동작을 조금 바꿀 수 있다.
예를 들면 서버에서 사용할 수 있는 Git 명령어를 제한할 수 있다.
또 명령어를 실행했을 때 나오는 메시지도 변경 할 수 있다.
git help shell 명령어를 실행하면 Git 셸을 꾸미는 데에 필요한 정보를 얻을 수 있다.
단!! 이렇게 하면 git 계정으로 git에 저장소도 못 만드니, 다른 (관리자로 사용하는 계정의)사용자를 git 그룹에 추가해준다.
요 순서로 내용을 채워넣자.