본문으로 바로가기

[Ubuntu] 우분투 Git 서버 구축

category 리눅스/Ubuntu 2013. 8. 29. 07:07

우분투에서 Git 서버를 구축하는 방법에 대한 설명으로 협업환경을 구축하거나 로컬 저장소 이외의 백업저장소의 개념으로 사용될 수 있습니다.

Git 서버를 구축하기전에 GitHub나 Gitlab등을 온라인으로 무료로 사용할 수 있음을 고려해봐야 한다. 공개형 프로젝트라면 GitHub를 비공개형 프로젝트라면 GitLab을 사용하면 굳이 따로 서버를 마련할 필요가 없다.

  Git GitHub GitLab
서비스 유형 패키지/소스 설치 제공 온라인 서비스 패키지/소스/온라인 서비스 제공
온라인 서비스 제약 없음 비공개 프로젝트는 유료 저장소당 1Gb의 용량제한

아래에선 OpenSSH 서버가 설치되어 있고 프로토콜로 SSH를 사용한다는 가정하에 진행한다.

Git 최신버전 설치

우분투 12.04.02에서 git 설치시 1.7.9 버전이 설치된다. 최신버전을 사용하기위해서는 PPA를 사용해야 한다.

PPA를 사용할 때 쓰는 add-apt-repository 명령어가 작동하지 않으면 python-software-properties를 설치하고, 그래도 문제가 생기는 경우에는 software-properties-common을 설치하면 된다.

sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git-core
git version

Git 접근 권한 관리

git에 접근하는 권한을 설정하는 방법에는 아래와 같은 세가지 방법이 있다.

1. SSH로 접근가능한 유저들의 계정을 생성하는 방법

이 방법은 서버에 접근할 유저들의 계정을 생성해주고 접근할 저장소에 권한을 부여해야 되기 때문에 보안상 아래의 두가지 방법보다 취약하고 관리자의 노고가 따르기 때문에 추천하지 않는다.

2. 대표계정(git)을 생성해 접근하는 사용자 관리

이 방법은 대표유저(git)를 생성하고 SSH key를 이용해 등록된 사용자에게 최소한의 권한을 부여하는 방식으로 권한 설정이 복잡하지 않은 저장소를 이용할때 많이 사용한다. 다만 저장소에 접근이 허락된 사용자들은 다른 저장소 또한 push / pull 이 가능하기에 세심한 주의가 필요한 경우에는 추천되지 못한다.

3. gitolite 툴을 이용한 접근 관리

여러개의 저장소를 운영하고 각각의 접근 권한을 원하는데로 설정하기 위해 추천되는 방식이다. 각각의 branch, tag, 저장소별 접근 권한을 설정할 수 있고 그룹관리가 가능해진다. 또한, 공개/비공개형의 저장소 설정이 편리하다.

여기서는 2번의 방법에 대한 설명을 하고 차후 3번의 방법을 설명한다.

대표계정(git)을 생성해 접근하는 사용자 관리

대표계정을 생성하고 저장소 권한 변경

# 사용자 생성, 비밀번호 입력
sudo adduser git

# git 사용자로 로그인
su git

위에서 생성한 git 계정은 커밋(commit)에는 아무런 영향도 끼치지 않고 접속하는데 사용된다.

git 사용자의 홈 디렉토리에 SSH-key 등록

# 홈디렉토리로 이동
cd ~  

# .ssh 디렉토리 생성
mkdir .ssh  

# 권한 변경
chmod 700 .ssh  

# 서버로 공개키를 전송하고 등록
cat id_rsa.pub >> ~/.ssh/authorized_keys

# 권한 변경
chmod 600 ~/.ssh/authorized_keys

# 전송받았던 사용자키 삭제
rm -rf id_rsa.pub

git 저장소에 접근허가를 할 사용자들의 공개키를 어떤 방식으로든 전송받아(이메일) 계속 등록해주면 된다.

접근 테스트는 ssh git@서버주소로 접속해서 암호를 묻지않고 바로 접속되면 SSH-Key 등록이 완료된 것이다.

보안을 위한 쉘기능 제한

git 계정으로 접속한 유저들이 할당된 권한으로 서버를 휘젓고 다니면 안되므로 이를 제한한다.

sudo vi /etc/passwd

  git:x:1001:1001:,,,:/home/git:/bin/bash

위의 git 계정을 찾아 /bin/bash 부분을 /usr/bin/git-shell 로 변경한다.

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

다시 접속해보면 접속이 거부된다.

Git 저장소 생성

git 의 저장소로 사용될 위치를 원하는 곳으로 생성한다. 아래는 위에서 만든 git 사용자의 홈디렉토리에 저장소를 생성한다.

# git 사용자로 로그인한 상태에서 홈디렉토리로 이동
cd ~

# 저장소로 사용할 디렉토리 생성
mkdir repos 

여러개의 저장소를 생성할 것이므로 하부에 프로젝트이름으로 디렉토리를 생성한다. 관례에 따라 저장소의 이름은 *.git으로 끝난다.

mkdir test_project.git

원격(remote) 저장소의 경우 워킹디렉토리가 없는 저장소이다.

일반적인 로컬 저장소 생성의 명령어에 --bare 옵션을 주면 원격저장소가 만들어지고 --shared 옵션을 주면 자동으로 그룹 쓰기 권한을 추가한다.

최초로 원격저장소를 생성하는 경우

cd /home/git/repos/test_project.git
git init --bare --shared

아래와 같은 파일들이 생성된다.

drwxrwsr-x 7 root root 4096 Aug 29 02:16 .
drwxr-xr-x 3 root root 4096 Aug 29 02:07 ..
drwxrwsr-x 2 root root 4096 Aug 29 02:16 branches
-rw-rw-r-- 1 root root  126 Aug 29 02:16 config
-rw-rw-r-- 1 root root   73 Aug 29 02:16 description
-rw-rw-r-- 1 root root   23 Aug 29 02:16 HEAD
drwxrwsr-x 2 root root 4096 Aug 29 02:16 hooks
drwxrwsr-x 2 root root 4096 Aug 29 02:16 info
drwxrwsr-x 4 root root 4096 Aug 29 02:16 objects
drwxrwsr-x 4 root root 4096 Aug 29 02:16 refs

기존에 사용하던 저장소가 있는 경우

git clone --bare --shared URL주소

접근 테스트

클라이언트에서 리모트 저장소를 내려받는다.

git clone ssh://git@서버주소:/home/git/repos/test_project.git

기존에 사용하던 remote 제거하기

git remote remove origin

TroubleShooting

레파지토리 퍼미션에 문제가 있다면 다음 오류 구문을 보게 될것이다.

insufficient permission for adding an object to repository database ./objects

해당 레파지토리로 이동해서 다음을 실행하자.

cd /home/git/repos
sudo chmod -R 770 *

그래도 안된다면 다음과 같이 sharedrepository옵션을 true로 지정하자.

sudo git config core.sharedrepository true