1. Git를 설치한다.
git 저장소를 등록하고, git-core를 설치한다.
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get upgrade
$ sudo apt-get update
$ sudo apt-get install git-core
$ git version
2. Git 관리와 저장소 관리를 위한 계정을 생성한다.$ sudo adduser gitolite
$ sudo adduser git-repo
gitolite 계정은 사용자(user)가 저장소에 접근할때 사용되는 계정이고, git-repo 계정은 저장소를 관리하는 계정이다.3. gitolite를 설치한다.
$ su - git-repo
$ git clone https://github.com/sitaramc/gitolite.git
$ ./gitolite/install
4. gitolite 계정에서 저장소(git-repo)로 접속하기 위해서 SSH Key를 등록한다.
$ su - gitolite
$ ssh-keygen
$ scp ~/.ssh/id_rsa.pub git-repo@localhost:/home/git-repo/gitolite.pub
$ ...
$ su - git-repo
$ ./gitolite/src/gitolite setup -pk ./gitolite.pub
즉, 저장소(git-repo)를 관리하는 계정으로 gitolite를 등록했기 때문에 이제부터 저장소에 관한 모든 동작은 "gitolite"에서 진행한다.당연히, git-repo관리를 위한 Tool(gitolite-admin)을 받아온다. 참고로, 저장소(git-repo)관리도 git를 사용하기 때문에 git 사용을 위해서 email과 name을 등록한다.
$ su - gitolite
$ git clone git-repo@localhost:gitolite-admin.git
$ git config --global user.email "gitolite@mymail.com"
$ git config --global user.name "gitolite"
5. 사용자 계정을 생성하고, "testing.git"를 clone하고, 수정해서 push하고, 다시 clone하는 과정을 실행해 본다.
새로운 사용자에 대해서 git를 사용하기 위해서는 email과 name을 등록해야 한다.
$ sudo useradd user1
$ su - user1
$ git config --global user.email "user1@myemail.com"
$ git config --global user.name "user1"
$ git config --list
사용자의 SSH Key를 생성하고, public key를 gitolite에 등록한다.$ su - user1
$ ssh-keygen
$ scp ~/.ssh/id_rsa.pub gitolite@localhost:/home/gitolite/gitolite-admin/keydir/user1.pub
$ ...
$ su - gitolite
$ cd gitolite-admin
$ git add keydir/user1.pub
$ git commit -a -m "add user user1"
$ git push
// 사용자를 삭제하는 경우
$ git rm keydir/user1.pub
$ git commit -a -m "remove user1"
$ git push
사용자(user1) 계정에서 "testing.git"를 "clone"한다.$ su - user1
$ git clone git-repo@localhost:testing.git
testing.git가 비어있기 때문에 "warning: You appear to have cloned an empty repository." 경고문이 발생한다."testing"폴더에서 새로운 파일을 생성하고, Git 저장소에 push한다.
$ su - user1
$ cd testing
$ vi file.txt
$ git status
$ git add file.txt
$ git status
$ git commit -a -m "create file"
여기까지는 git의 local에 대한 설정이다. 즉, 원격 저장소와는 관계가 없다."user1" 계정의 git에 의해서만 관리되고 있다.
이제 현재 상태를 원격 저장소에 적용해 보자!
$ su - user1
$ cd testing
$ git push origin master
"user1" 계정의 다른 폴더에서 "testing.git"를 가져오고, "file.txt"가 존재하는지 확인한다.$ su - user1
$ mkdir temp
$ cd temp
$ git clone git-repo@localhost:testing.git
$ cd testing
$ ls -al
6. Windows PC에서 "SourceTree"를 사용해서 저장소에 접속해 본다."SourceTree"설치와 SSH Key 생성은 "개발환경" Blogger에서 "Git 사용하기"를 참조한다.
새로 생성된 SSH Key의 public key를 Git Server에 등록하자!
$ su - gitolite
$ cd ~/gitolite-admin/keydir
$ vi SourceTree_user1.pub
"PuTTY Key Generator"에서 public key를 복사한다.Git Server의 "gitolite"계정으로 접속해서 "gitolite-admin\keydir"폴더에 "SourceTree_user1.pub"파일에 붙여넣기 한다.
$ su - gitolite
$ cd ~/gitolite-admin/keydir
$ git add SourceTree_user1.pub
$ git commit -a -m "add user SourceTree_user1"
$ git push
아래와 같이 SourceTree에 SSH private.key를 등록한다.("도구" ->"옵션")
"복제/생성" 버튼을 클릭하고, "소스 경로"를 기술한다.
git-repo@192.168.152.130:testing.git
"저장소 종류"에 "Git 저장소 입니다"로 표시되면 정상동작을 나타낸다.
"클론"버튼을 클릭한다.
앞서 Ubuntu에서 작업한 이력이 그대로 보여진다.
참고로, 위의 과정중에 vmware 네트워크 설정과 도서관 공유 네트워크로 인해서 여러 설정이 변경되었고, SourceTree에서 RAM 상주 프로그램 때문에 고생했다.
7. GitWeb 설치 및 사용.
Web을 통해서 저장소의 내용을 파악하기 위해서 GitWeb을 설치한다.
$ sudo apt-get install gitweb
기본적으로 Ubuntu에서 아파치(apache2) 서버가 설치되어 있으므로, 아파치(apache2) 서버를 따로 설치할 필요는 없다.단, gitweb에서는 cgi를 사용하므로, 아파치 서버에서 CGI를 사용하도록 enable해야 한다.
$ sudo a2enmod cgi
GitWeb에 저장소의 위치를 등록하기 위해서 "/etc/gitweb.conf"파일에 "$projectroot"와 "$projects_list"변수를 설정한다.$ sudo vi /etc/gitweb.conf
-> $projectroot = "/home/git-repo/repositories/";
-> $projects_list = "/home/git-repo/projects.list";
-> $projects_list = $projectroot" --> projects.list가 update되지 않는다.
gitweb에서 조회하게 되는 사용자/디렉토리에 권한을 부여한다.$ sudo usermod -a -G git-repo www-data
$ sudo chmod g+r /home/git-repo/projects.list -> sudo chmod 666 /home/git-repo/projects.list
$ sudo chmod -R g+rwx /home/git-repo/repositories -> sudo chmod -R 755 /home/git-repo/repositories
$ sudo vi /home/git-repo/.gitolite.rc
-> UMASK => 0027,
아파치(apache2) 서버를 다시 실행한다.$ sudo service apache2 restart
windows PC에서 GitWeb(http://ubuntu_IP/gitweb)으로 접속한다.
"404 - No projects found"가 보이는 것은 "/home/git-repo/repositories"폴더에 대한 접속 권한이 없기 때문이다. 간단히 "git-repo"계정으로 접속해서 "repositories"폴더의 권한을 "755"로 설정하면 해결된다.
앞서 "usermod"명령으로 "git-repo" 그룹에 "www-data" 계정을 추가하였기 때문에 gitweb에서 접속할때 "git-repo" 그룹의 권한을 gitweb에서도 가진다. 따라서 "projects.list"와 "repositories"폴더의 권한을 "gitweb"에서도 동일하게 가진다.
위와 같이 "testing.git" project가 보여진다.
8. 저장소에 새로운 사용자와 Project 추가하는 방법.
새로운 사용자 "kwangho9" 계정을 생성하고, SSH public key를 관리자("gitolite")에게 전달한다. 향후 git를 사용하기 위해서 "email"과 "name"을 등록해야 한다.
$ sudo adduser kwangho9
-> enter 'kwangho9' new password
$ su - kwangho9
$ ssh-keygen
$ scp .ssh/id_rsa.pub gitolite@localhost:/home/gitolite/gitolite-admin/keydir/kwangho9.pub
-> enter 'gitolite' password
$ git config --global user.email "kwangho9@gmail.com"
$ git config --global user.name "kwangho9"
"gitolite"계정에서 새로운 사용자의 public key를 등록한다.$ su - gitolite
$ git add ./gitolite-admin/keydir/kwangho9.pub
$ git commit -a -m "add new user 'kwangho9'"
$ git push
"kwangho9"계정에 대한 "project1"이라는 저장소(git)를 생성하자!(git project는 "gitolite"계정에서 처리한다.)$ su - gitolite
$ vi ./gitolite-admin/conf/gitolite.conf
-> repo kwangho9/project1
-> RW+ = kwangho9
$ git commit -a -m "user2 new repository create"
$ git push
// 저장소 삭제는 conf/gitolite.conf를 수정해서 적용할 수 있지만, 완전히 지우지는 못한다.
// 따라서, console 명령으로 직접 지워야 한다.
$ sudo rm -fr /home/git-repo/repositories/project3.git
참고로, 모든 저장소는 GitWeb으로 공유되지는 않습니다. 공개를 원하지 않는 저장소도 있기 때문에 기본적으로 공개하지 않습니다. 저장소에 "git-daemon-export-ok"파일이 존재하면 공개되고, 그외에는 공개되지 않습니다.일반적으로 저장소 설정에서 사용자가 "@all"로 기술되면 공개됩니다.
$ su - gitolite
$ cd ./gitolite-admin/
$ vi conf/gitolite.conf
-> repo user1/project1
-> RW+ = @all
$ git commit -a -m "create repository 'user1/project1'"
$ git push
$ su - git-repo
$ ls ./repositories/user1/project1
-> git-daemon-export-ok 파일이 존재한다.
$ cat ./projects.list
-> user1/project1 폴더가 등록된다.
gitweb에 보여지지만, 사용자만 write권한을 갖기 위해서는 아래와 같이 설정한다.$ su - gitolite
$ cd ./gitolite-admin/
$ vi conf/gitolite.conf
-> repo user1/project1
-> R = @all
-> RW+ = user1
$ git commit -a -m "create repository 'user1/project1'"
$ git push
사용자(user1)은 저장소(project1)에 대해서 모든 권한을 가지고, 저장소(project1)은 gitweb을 통해서 공개된다.Gitolite 권한 설정에 대해서는 "Gitolite 권한 설정"을 참조하기 바란다.
생성된 Project를 클론해보자!
$ su - kwangho9
$ git clone git-repo@localhost:user2/project1.git
결론적으로 사용자 등록을 하고, 사용자의 SSH public key와 project name을 관리자("gitolite")에게 전달한다. 저장소 관리자("gitolite")는 project name을 "./gitolite-admin/conf/gitolite.conf"에 등록하고, public key를 등록한다.
관리자("gitolite")에서 진행하는 일은 아래와 같다.
$ su - gitolite
$ vi ./gitolite-admin/conf/gitolite.conf
-> repo kwangho9/project1
-> RW+ = kwangho9
$ git add ./gitolite-admin/keydir/kwangho9.pub
$ git commit -a -m "add new user and project create"
$ git push
기존 사용자가 project만 추가되는 경우에는 관리자("gitolite")에게 project name만 보내주면 된다.$ su - gitolite
$ vi ./gitolite-admin/conf/gitolite.conf
-> repo kwangho9/new_project
-> R = @all
-> RW+ = kwangho9
$ git commit -a -m "add new project create"
$ git push
"gitolite.conf"를 수정한 후에 "git push"를 적용하면, projects.list가 초기화 된다.gitweb에서 폴더별로 암호를 지정해서 사용자만 확인 가능하도록 해야 한다.
sourcetree에서는 SSH key를 1개만 등록이 가능한데, 여러개의 SSH key를 사용한다면 어떻게 해야 하는가?
참조
9. htpasswd를 이용한 GitWeb 보안.
참조1
참조2
10. Windows에서 Project 생성 및 준비 사항
11.
END