Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

... 미완성

Contents

git server 설치

직접 git 환경을 만들어야 하는 처지에 놓이게 됐다. SVN과 비교해 보자면, 설치가 마냥 쉬운 것 만도 아니라서 정말 정말 정말 귀찮더라. 아뭏든 "분산"이라는 이름이 들어가면 이해하기도 어려워지고 그만큼 환경 만드는 것도 어려워진다.

Distributed Source Code Management ?

때로 말이라는게 사람을 현혹하기한다. DSCM(Distributed source code management)라는 설명이 딱 이런 경우인 것 같다. DSCM은 그냥 개인 개발 PC에 저장소를 하나 더 두겠다는 거다. 단순하기 그지 없는 개념인데, 이거 때문에 개념이 들어오기 까지 시간이 꽤나 걸렸다. 나만 그런건가 ?

  • 개인 PC 마다 저장소가 만들어지니까. 저장소가 분산되는 거고, 그래서 분산 소스코드 관리 시스템이 된거다.
  • 개인 PC에 저장소가 만들어지니, commit을 하면 일단 개인 저장소에 코드가 올라간다. push를 해야 중앙 저장소에 코드가 올라간다.
  • 개인 PC에 저장소가 하나 만들어지니, 오프라인에서도 개발할 수 있다. 당연하다.
  • 개인 PC에 저장소가 만들어지니 중앙 저장소에 올리기 전에, 자유롭게 branch를 따서 개발하고 나중에 중앙 저장소에 있는 코드에 병합할 수 있다. 독립적인 개발환경의 구축이 가능하다는 이야기다. 왜 ? 저장소가 분산돼 있으니까.

설치 환경

설치 환경은 다음과 같다.
  • Virtualbox
  • 운영체제 : Ubuntu 13.04
  • git server 호스트 이름 : git-server

git - gitolite 설치

git은 ssh를 이용한 유닉스 계정기반의 접근 설정이 가능하다. ssh 서버만 있으면 되는 구조라서 간단한 구성이 가능한다. 저장소(repository)에 대한 접근설정 등에 제한이 있다.

gitolite는 git 저장소에 대한 섬세한 접근제어가 가능해서, 오픈소스진영은 물론 기업환경에서도 널리 쓰이는 소프트웨어다. Fedora의 경우 gitolite를 이용해서 10,000개가 넘는 패키지를 관리하고 있다고 한다.

git 설치

gitolite는 git기반으로 작동한다. 그러므로 git 설치는 필수다.
root@git-server # apt-get install git

관리 구성도 및 관리 프로세스

git - gitolite를 이용한 저장소 및 권한 관리 구성 모습이다. 어디까지나 개인적인 설정이다.

  1. git server : git 이 설치된 서버 호스트
  2. git-admin : git 사용유저와 저장소 별 권한을 관리하는 git 관리자 계정
  3. git-repo : git 저장소를 관리하는 유저
관리 프로세스는 다음과 같다.
  1. git-admin으로 프로젝트를 위한 저장소를 만든다.
  2. 프로젝트에 개발자를 추가한다. 개발자의 추가는 ssh public key 기반이다. git 관리자(git-admin 계정 권한을 가지는)은 프로젝트에 참여하려는 개발자에게 ssh public key를 달라고 한다. 관리자는 publick key를 등록하고, 이 유저에게 프로젝트 저장소에 대한 권한을 설정한다.
  3. 유저는 git-repo로 프로젝트를 clone 한다. ssh 프로토콜을 사용하며, ssh public key에 대한 private key를 이용해서 접근한다. git-repo는 git-admin에게 유저 인증 여부와 권한을 물어본다.
  4. git-admin은 ssh public key와 권한 정보를 이용해서 git 서버에 대한 접근 여부를 git-repo에게 알려준다.
  5. 이제 개발자는 git 저장소를 사용할 수 있다.
대략 이런 식으로 멀티계정을 관리할 수 있다. 여기에서는 git-repo가 일종의 대표 계정 역할을 한다.

git 관리자 계정 생성

Git 관리를 위한 대표 계정을 만든다. 이 대표 계정으로 git 사용자 계정을 만들고 권한을 관리한다. Git 관리자 계정이라고 보면 된다. 관리 계정 이름은 정하기 나름이다. 나는 git-admin 으로 만들었다.
root@git-server # adduser git-admin
Adding user `git-admin' ...
Adding new group `git-admin' (1001) ...
Adding new user `git-admin' (1001) with group `git-admin' ...
Creating home directory `/home/git-admin' ...
Copying files from `/etc/skel' ...
Enter new UNIX password: 
Retype new UNIX password: 
...

git 저장소 계정 생성

저장소를 별도의 계정에서 관리하기로 했다. 계정 이름은 git-repo로 했다. 대표계정으로 사용한다.
root@git-server # adduser git-repo

gitolite 설치

gitolite를 설치한다. gitolite는 저장소를 관리하는 git-repo 계정으로 설치하면 된다.
root@git-server # sudo su - git-repo
git-repo@git-server # pwd 
/home/git-repo

git을 이용해서 최신 코드를 받아오면 된다.
git-repo@git-server # git clone https://github.com/sitaramc/gitolite.git
Cloning into 'gitolite'...
remote: Counting objects: 8157, done.
remote: Compressing objects: 100% (3339/3339), done.
remote: Total 8157 (delta 4970), reused 7769 (delta 4649)
Receiving objects: 100% (8157/8157), 2.90 MiB | 325 KiB/s, done.
Resolving deltas: 100% (4970/4970), done.

install 스크립트를 실행한다.
git-repo@git-server # ./gitolite/install 
use the following full path for gitolite:
        /home/git-repo/gitolite/src/gitolite

gitolite 환경 설정

이제 gitloite 환경을 설정해야 한다.

ssh key를 만든다.
git-admin@git-server # ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/home/git-admin/.ssh/id_rsa): 
...

이 공개키를 git-repo로 전송한다.
git-admin@git-server # scp .ssh/id_rsa.pub git-repo@localhost:/home/git-repo/git-admin.pub

이제 git-repo계정에서 git-admin 공개키를 등록한다.
git-repo@git-server # ./gitolite/src/gitolite setup -pk git-admin.pub 
Initialized empty Git repository in /home/git-repo/repositories/gitolite-admin.git/
Initialized empty Git repository in /home/git-repo/repositories/testing.git/
testing.git과 gitolite-admin.git 두 개의 저장소가 만들어 졌다. testing.git은 테스트용 저장소니까 그냥 무시하면 된다. 중요한건 gitolite-admin.git 저장소다. 이 저장소에 git 사용자 계정과 관련된 모든 정보가 들어간다.

git-admin으로 gitolite-admin 저장소를 clone해 온다.
git-admin@git-server:~$ git clone git-repo@localhost:gitolite-admin.git
Cloning into 'gitolite-admin'...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
Receiving objects: 100% (6/6), 740 bytes, done.
remote: Total 6 (delta 0), reused 0 (delta 0)
이걸로 환경설정을 끝냈다. 이후 git 저장소와 계정/권한에 관한 작업은 git-admin 계정으로 진행하면 된다.

gitolite-admin 디렉토리에는 "keydir"과 "conf" 디렉토리가 있다.
  • keydir : 유저의 ssh 퍼블릭 키를 관리한다.
  • conf : 저장소와 저장소에 대한 권한 관리를 위한 설정 파일이 있다.

git 유저 관리

git 유저로 등록해 보자. 등록 과정은 다음과 같다.
  1. 프로젝트에 새로운 개발자가 참여하게 됐다. 이 개발자를 git server에 등록해야 한다.
  2. 관리자 는 개발자에게 계정이름과 ssh 퍼블릭키를 달라고 요청한다.
  3. 개발자는 ssh-keygen을 이용 퍼블릭 키를 만든다. 계정 이름은 yundream으로 하기로 했다.
  4. 관리자는 (메일 등으로) yundream.pub 파일을 받았다.
관리자는 git-admin 계정에서 yundream.pub 파일을 등록하면 된다.
git-admin@git-server # mv yundream.pub gitolite-admin/keydir/ 
git-admin@git-server # ls gitolite-admin/keydir/ 
git-admin.pub  yundream.pub

yundream.pub 파일을 push 한다.
git-admin@git-server # git add yundream.pub
git-admin@git-server # git commit -a -m "yundream account add"
git-admin@git-server # git push

추가한 계정으로 testing.git을 clone해보자. commit, push 까지 성공했다면 OK.
# git clone git-repo@git-server:testing.git

저장소 권한 설정

gitolite-admin 계정으로 저장소와 저장소에 대한 권한을 설정할 수 있다. 설정파일 gitolite.conf를 열어보자.
git-admin@git-server # cat ~/conf/gitolite.conf 
repo gitolite-admin
    RW+     =   git-admin

repo testing
    RW+     =   @all
  • repo : 저장소 이름
  • RW나 RW+ 는 권한이다.
  • 권한 뒤에는 권한을 가지는 유저나 그룹을 명시한다. 앞에 @이가 붙으면 그룹이다. @all 모든 유저를 의미한다.
그룹은 아래와 같이 설정할 수 있다.
@oss_repos      = linux perl rakudo git gitolite
@secret_repos   = fenestra pear

@admins         = scott     # Adams, not Chacon, sorry :)
@interns        = ashok     # get the spelling right, Scott!
@engineers      = sitaram dilbert wally alice
@staff          = @admins @engineers @interns

권한은 R, RW, RW+, -가 있다.
  • R : 읽기만 할 수 있다.
  • RW : 저장소에 쓸 수 있다. 새로운 저장소를 만들 수도 있다.
  • RW+ : 저장소를 삭제할 수도 있다.
  • - : 접근 거부
브랜치 단위로 권한을 줄 수 있지만 파일 단위로도 권한을 제어할 수 있다. 예를 들어 Makefile 같은 경우에는 아무나 건드리면 안될 거다. 다음과 같이 특정 그룹만 접근하도록 할 수 있다.
repo foo
   RW      = @junior_devs @senior_devs

    RW  NAME/           =   @senior_devs
    -   NAME/Makefile   =   @junior_devs
    RW  NAME/           =   @junior_devs

이제 myproj 이라는 새로운 그룹을 만들어 보자.
repo myproj
   RW+   = yundream

위 내용을 추가하고 push하면 저장소가 만들어지고 권한까지 설정 된다.
git-admin@git-server # git commit -a -m "myproj repository create"
[master 91e2144] myproj repository create
 1 file changed, 3 insertions(+)
git-admin@git-server # git push 

관련 글