"Gitolite"는 특이하게 "personal branches"라는 것을 지원해준다.


처음에는 Pro-Git 책에서 이에 대한 언급이 있어서 여기저기 살펴보았었는데,
자료가 너무나 심플하게만 있고 원론적인(?) 이야기만 있어서 그냥 그런갑다~하고 넘어갔었다.


그러다가 회사에서 업무를 하던 중 아래와 같은 개발자의 VOC(?)를 듣게 되었다.

master 브랜치에는 마음대로 push하기가 부담스럽고,
로컬에서 별도로 브랜치를 만들어서 작업을 하면 작업 내용이 날라갈까봐 걱정이 된다.
내가 작업한 내용들에 대해서도 백업이 되면 좋겠다.


즉, 자신이 작업하는 내용에 대한 백업이 필요하다는 말이었다.



이 이야기를 듣고 처음에는 충격이었다.

Git 의 가장 큰 강점이 바로 "분산 형상 관리"이다.

즉, 작업 내용을 commit 할 때마다 서버에 접근하지 않아도 된다는 점이 Git의 강점이라는 것인데,
commit 한 내용이 로컬에 머무른다는 것이 단점이 될 수도 있다는 사실에 좀 충격이었다!!!


절대 위와 같은 Work Flow로 작업을 하라고 가이드 하는 것은 아니다.
지금 설명을 위해서 위와 같은 branch 정책을 가지고 개발을 한다고 가정을 해보는 것이다. 샘플!!!

아래 글로 적힌 내용에 대해서는 잘 읽어보는 것을 추천한다 ^^
(실제 회사에서 이루어지는 것을 반영한 부분도 있으니...^^)

왼쪽은 Server Repository이고, 오른쪽이 Local Repository이다.

Server에서는 master와 develop branch를 운영하는데,
기본적으로 두 개의 branch 모두 어느 정도 다듬어진 결과물이 올라와야 한다.

빌드를 기준으로 말하자면
Server의 master, develop branch 모두 빌드가 항상 성공되어야 한다.

반면, Local에 있는 develop branch에서 개발자가 열심히 개발을 하는데,
Server의 develop branch에는 빌드가 정상적으로 되는 결과물만 push 해줘야 한다.
즉, 이래 저래 작업한 내용을 막 push 하면 안되고, 그것은 local 안에서 commit만 이루어지도록 해야한다.

그런데, 개발자는 작업한 결과물 뿐만 아니라
작업 중인 내용물에 대해서도 서버에 백업이 되었으면 좋겠다고 하는 것이다.

그래서 개발자는 별도의 branch를 local에 만들어서 작업을 해본다.
my_br 이라는 branch를 만들어서 작업을 하고 그걸 다시 local에 위치한 develop으로 merge를 해주는 방식이다.
이제 이 my_br이라는 branch만 어디 다른 곳에 저장할 수 있으면 되는 것이다.


오른쪽에 새로 생긴 부분과 같이 Local에서 작업한 내역을 push할 수 있는 Server Repository가 있다면...?!



앞에서 우리는 Gitolite 설치와 운영에 대해서 알아보았다.
문제는 대부분의 회사에서 일반 개발자들에게 repository 생성 권한을 주지 않는다는 점이다.

물론 개인적으로 별도의 Git Server를 만들어서 그곳으로 push 하도록 한다던지 뭐 다양한 방법이 있겠지만,
우리의 Gitolite는 Personal Branch라는 기능을 제공해준다.



푸헬~ 위에 주저리 주저리 적었는데, 별 쓸모 없는 말만 주절거린 것 같다.
하지만 뭐 그래도 적은 것이 아까우니까.... ^^



1. Gitolite

     - "personal branch"를 사용하기 위해서는 Gitolite 설정을 해줘야 한다.

 

$ ssh gitolite@localhost
$ cd ./repositories


     - Gitolite의 환경파일을 변경해야하기 때문에 Gitolite 관리자 계정으로 접속하자.
     - [ gitolite-admin.git ] repository를 clone 한 곳으로 이동하자.


$ nano ./conf/gitolite.conf


     - [ gitolite.conf ] 파일을 수정하면 된다.

@whatwant = chani gitolite

repo gitolite-admin
    RW+     =   gitolite

repo testing
    RW+     =   @all

repo bare1repo
        RW+                              = @whatwant
        RW+     personal/USER/  = @whatwant


     - 위에 별도로 색으로 칠한 부분이 핵심이다.
     - [ /USER/ ]와 같이 되어있는 부분은 일종의 예약어이다. (personal 으로 되어있는 부분은 임의)

     - 위와 같이 하면 [ refs/personal/사용자계정/ ]이라는 네임스페이스를 사용할 수 있게 되는 것이다.
     - 그런데, 왜 브랜치가 아니라 네임스페이스라고 하였을까?!
     - 실제로 사용할 때에는 [ refs/personal/사용자계정/branchname ]과 같이 사용한다.

$ git commit -a -m "personal branch setting"
$ git push


     - 수정 후 종종 잊는 것이 commit과 더불어 push이다. 꼭 반영하길~




2. push

     - personal branch에 대한 자료가 너무 없어서 개인적으로 알아본 것으로만 정리를 하겠다.
        (적어도 국내 한글로 된 자료 중에서는 최초의 personal branch 관련 자료가 아닐지...)
     - 이제 어떻게 사용하는지 한 번 알아보자.


$ git push origin develop:refs/personal/chani/mywork


     - Local에 있는 특정 branch의 내용을 Server의 내 personal branch의 임의의 branch로 push해 주는 것이다.

     - personal branch는 백업의 의미로 사용하는 것이 큰 것으로 보인다.
     - 즉, 그냥 사용하는 branch와는 그 용도가 조금 다른 것이다.
     - 물론 위의 스크린샷과 같이 변경 사항을 포함하는 내용을 push 할 수도 있지만, 그냥도 push할 수 있다.

     - [ git push origin (local branch 名):refs/personal/(계정)/(임의의 branch 名) ]



3. pull

     - 그러면 personal branch 내용을 받아올 때에는 어떻게 할까?

 

$ git pull origin refs/personal/chani/mywork:wow


     - personal branch의 내용을 내려받을 때엔 임의의 branch로 내려 받는다.

     - [ git pull origin refs/personal/(계정)/(branch 名):(임의의 local branch 名) ]



4. delete

     - 만들었으면 지우는 방법도 알아보자.

 

$ git push origin :refs/personal/chani/mywork


     - 일반 branch를 삭제하는 것과 같은 방법으로 삭제할 수 있다.




5. Server

     - 이렇게 만든 personal branch는 Server에서 어떻게 확인할 수 있을까요?


     - Server에 위치한 repository를 살펴보면 personal branch의 상황에 대해서 알 수 있다.
     - 위 스크린샷은 delete를 해버려서 안보이지만, 만들어놓은 상태라면 위와 같이 따라가서 확인할 수 있다.




헥헥... 알고보면 별 것도 아닌 내용이지만,
워낙에 설명을 찾아보기 힘든 부분이라서 많은 시간을 할애해야만 했다.

그러던 중에, 여기 이 블로그를 통해서 너무 반가운 소식이 들어와서 잠시 헬렐레~했고,
부처님 덕분에 연휴를 맞이했고,
장모님의 환갑을 맞이했고,
뭐 그런 연유로 이제서야 포스팅~ ^^

앞으로 해야할 부분이 너무나 많이 남았네요~ 부지런히 달려봅시다~!!

반응형

어이없게도 Gitolite의 설치나 설정만 신경썼지,
사용자를 추가하는 것과 repository를 추가하는 것은 신경도 안썼다.

소사~ 소사~ 맙소사~!!!

     - http://sitaramc.github.com/gitolite/users.html


물론 앞에서 설명한 것들을 잘 조합하면 사용자 추가하는 방법과 repository 추가 등록하는 방법을 알 수는 있지만,
나름 정리하는 차원에서 다시 한 번 살펴보자.



1. 사용자 추가하기

     - Gitolite는 SSH 공개키 (public key) 파일로 사용자 등록을 한다.


$ ssh gitolite@localhost
$ cd ./repositories/gitolite-admin
$ cd ./keydir
$ scp chani@localhost:/home/chani/.ssh/id_rsa.pub ./chani.pub

     - Gitolite 관리자 계정으로 들어가서 clone 해놓은 [ gitolite-admin ] repository 에 위치하자.
     - [ gitolite-admin ] repository를 살펴보면 [ keydir ] 디렉토리가 있다. 이곳이 바로 공개키를 넣을 곳이다.

     - 내 경우는 "scp"를 이용해서 'chani' 계정의 공개키를 복사해왔다.

     - 여기에서 중요한 점은 가져온 공개키의 파일명이다. chani 계정의 경우 [ chani.pub ]라고 이름을 지어줬다.
     - 그러면 다르게 하는 경우도 있지않을까?라는 의문점이 드는데... 불행하게도(?) 그렇다.

     - 사용자 1명이 1개의 공개키를 사용하면 무관하지만, 복수개의 공개키를 사용할 때에는 어떻게할까?!
     - [ chani@gmail.pub, chani@whatwant.pub ] 처럼 파일이름을 해도 되고,
     - [ chani@gmail.com.pub, chani@whatwant.com.pub ] 처럼 파일이름을 해도 된다.



2. Error

     - 그런데, 여기에서 에러 상황이 발생했다.


$ git add ./keydir/chani.pub
$ git commit -a -m "add user 'chani'"
$ git push

     - 여기에서 경고 메시지를 발견했나요?

remote: WARNING: keydir/chani.pub duplicates a non-gitolite key, sshd will ignore it

     - 어?! gitolite가 아닌 키가 중복된다고?! sshd가 이걸 무시할거라고? 이게 뭔말이지?
     - 매뉴얼 등에서 이런 말은 못들었는데~!!!

     - 그래서 뭔가 이상해서 chani의 SSH 키 파일을 새로 생성해서 gitolite-admin/keydir/ 에 다시 등록해보았다.
     - 그랬더니 이번에는 push가 잘 되었는데...

     - chani 계정에서 ssh로 git-repo@localhost 에 접근을 할 수가 없는 것이다.
     - 새로 생성한 공개키를 git-repo@localhost 에 등록하지 않았으니,
     - 즉, 예전 공개키가 등록이 되어있으니 당연한 것이다.

     - 이 때 번뜩 떠오른 생각이 있으니...


     - "chani"라는 계정의 공개키를 지금 현재 2가지의 목적으로 사용하려고 하고 있는 것이다.
     - 물론 내부적으로는 SSH를 이용하고 있다는 점은 같지만,
     - SSH Console 로 접속을 하는 한가지와 Gitolite로 접속하는 한가지...
     - 즉, 2가지 접근 방법을 하나의 통로로 사용하려는 것이다.

     - 그럼 내부적으로 이걸 어떻게 확인할 수 있을까?


$ nano ./.ssh/authorized_keys


     - Gitolite 관리자 계정에서 [ ./.ssh/authorized_keys ] 파일을 확인해보자.


     - 어?! 이상한 내용이 추가되어 있다!!! [ # gitolite start ~ # gitolite end ] 라는 문장들이다.

     - 정확한 내부 로직은 분석을 해보지 않았지만 (솔직히 좀 귀찮다.... 흑... 분석해보면 도움이 될거라는 것은 알지만)
       일단 기본적인 SSH Login 흐름을 Gitolite가 가로채서 자신의 공개키로 인증하게 하는 것으로 추정이 된다.

     - 그러다보니 여기에서 문제가 발생하는 것이다. 같은 공개키를 사용하려하면 이 놈이 햇갈려하는 것 같다.

     - 결론은 같은 공개키로 SSH와 Gitolite를 사용하는 것은 안된다.
     - 어떻게 하면 할 수는 있겠지만, 문제의 소지가 있는 것은 원천적인 해결책을 찾기 전엔 하지 않는 것이 좋다!


     - 일단, 위와 같은 과정을 통해서 사용자 추가는 되었다!



3. Repository 추가하기

     - Gitolite로 관리하는 repository로 만들기에 대해서 알아봐야 하는데, 실은 엄청 쉽다.
     - 지금까지 Gitolite의 환경 파일 [ ./conf/gitolite.conf ] 파일에 해당 repository 정보만 적어주면 되는 것이다.

     - 문제는 이렇게만 알고 있다고 끝이 아니다!!! 이게 생각보다 복잡하다.



4. New Repository 생성하기

     - 신규로 repository를 생성하는 방법은 어떻게 될까?!


repo bare2repo
             RW+          = @whatwant

     - 실제로 존재하지 않는 [ bare2repo ]라는 이름의 repository에 대해서 권한 설정을 해준다.
     - 당연히 commit 하고 push 하는 것은 잊지 않기를...


     - 이제 어떻게 repository가 생기는 것인지 해보자.



     - 위와 같이 repository를 clone을 해서 사용할 수 있다.
     - 여기에서 포인트는 Server에 [ bare2repo.git ] repository가 없는데도 clone을 할 수가 있다는 점이다.

     - 그럼 여기에서 드는 궁금증. Gitolite의 권한 설정 없이 그냥 아무 이름이나 사용해서 가능할까?


     - 위 스크린샷과 같이 에러가 발생한다.


     - 결론!! 새로운 repository를 만들고 싶으면 [ ./conf/gitolite.conf ] 파일에 권한 설정을 해주면 된다!!!



5. Existing repository

     - 이번 포스팅에서 개인적으로 가장 큰 관심이 있는 부분은 바로 이것이다!
     - 기존에 작업하던 repository를 셋팅한 여기 이 Server에 넣어서 관리를 하고 싶을 때 어떻게 하면 될까?!


     - "git-repo" 계정으로 접속해서 가져오고 싶은 repository를 가져오자.
     - [ scp -r ] 명령으로 repository를 전송 받아오면 된다. (가져오는 방법은 각자 다양하게 있을 것이다)

     - 차례대로 따라왔으면 눈치챘겠지만, 가져왔으면 당연히 [ gitolite-admin/conf/gitolite.conf ] 파일을 손봐야한다.


repo bare1repo
             RW+          = @whatwant

     - "bare1repo" repository에 대한 설정을 넣어주면 된다. (commit & push 는 이제 더 이상 말하지 않아도...)

     - [ RW+    personal/USER/ = @whatwant ] 줄은 무시하시길....^^ 다음 포스팅 때 알게될것이니....

     - bare1repo.git repository를 위치에 놓고 계정 권한 설정을 했으니 이제 OK?????


     - 바로 해당 repository를 clone을 하면 위와 같이 error가 발생을 한다.
     - [ gl-conf ]를 못찾는다고 하는데, 대체 [ gl-conf ]가 뭐길래?


     - 혹시나하고 [ gitolite-admin.git ] repository에서 살펴보니 위와 같이 존재한다.
     - 내용은 계정에 대한 정보이다. 아마도 'GitoLite-CONFig' 파일인가보다.


     - 그래서 복사해 놓은 "bare1repo.git " repository의 파일을 살펴보니 당연하게도 [ gl-conf ] 파일은 없다.

     - 그러면, 이걸 어떻게 만들어 넣을 수 있을까?
     - 이 질문을 바꾸면 Gitolite에게 이 repository의 존재에 대해서 어떻게 알려줄 수 있을까?


$ ~/gitolite/src/gitolite setup

     - [ ~/gitolite/src/gitolite setup ] 명령을 실행시키면 [ gl-conf ] 파일이 생성이 된다.
     - 아무런 메시지를 보여주지 않아서 쫌 썰렁하지만, 너무나 간편하다.


     - 다시 clone을 해보면..... 짠~!!! 성공~!!!!



너무 길게 포스팅을 한 것 같지만...
그래도 매뉴얼 같은 곳에서 제대로 된 설명을 찾아보기 힘든 부분이니 잘 참고하세요~^^

반응형

'SCM > Git-GitHub' 카테고리의 다른 글

Rebase - 또 하나의 merge  (0) 2012.05.30
Gitolite - Personal Branches  (4) 2012.05.28
Git 계정 관리 - Gitolite's Repository  (4) 2012.05.20
Git 계정 관리 - Gitolite 설정하기  (3) 2012.05.19
Git 계정 관리 - Gitolite 설치하기  (23) 2012.05.15

Gitolite의 설정은 계정 관리 하나만의 문제가 아니다.
Repository 관리를 하기 위한 계정 관리 도구이므로 당연히 Repository 관리와도 밀접한 관계에 있다.


1. Repository

     - 제 포스팅을 따라서 Gitolite를 설치하신 분들은 아래와 같은 디렉토리 구조일 것이다.


     - 관심사항인 것만 표시한 것이다.

     - Gitolite에서 repository에 대해서 제약조건을 두는 것은 다음과 같다.

▷ 모든 repository는 Bare Repository여야 한다.
▷ 모든 repository의 접미사는 ".git"으로 끝나야 한다.




2. Path

     - 어떤 분의 문의로 인해서 알아보게 된 [ repositories ] 변경 방법이다.

     - 즉, 현재는 Gitolite 설치 時 정해진 경로대로 위 그림과 같이 자동으로 셋팅이 되어버린다.
     - 그런데, 다른 디렉토리로 설정하고 싶다거나 다른 디스크로 지정하고 싶을 경우에는 어떻게 해야할까?!

     - 여기저기 찾아본 결과 g3 버전의 Gitolite에서는 변경할 수 없었다.
     - [ $REPO_BASE ] 설정으로 변경할 수 있다고 하는데, 몇 번 테스트 결과 정상적으로 되지 않았다.

     - 그러면 어떻게 이 문제를 해결할 수 있을까?!

     - 뭐, 아시는 분들이라면 바로 알 수 있겠지만 '심볼릭 링크(ln)'를 이용하면 된다.

     - 중요한 것은 "권한 설정"이다.



오늘은 여기까지~ 헛! 또 날이 바뀌었네.... ㅠㅠ
반응형

'SCM > Git-GitHub' 카테고리의 다른 글

Gitolite - Personal Branches  (4) 2012.05.28
Gitolite - user, repo 추가하기  (14) 2012.05.26
Git 계정 관리 - Gitolite 설정하기  (3) 2012.05.19
Git 계정 관리 - Gitolite 설치하기  (23) 2012.05.15
GitWeb + Nginx  (0) 2012.05.09

하아~ Gitolite 설치하고 오랜시간이 흘렀다.
이제는 어떻게 쓰는지 알아보자.


1. pwd

     - Gitolite의 환경을 설정을 하기 위해서는 [ gitolite-admin.git ] repository를 다루면 된다.
     - 앞에서 Gitolite의 관리자로 [ gitolite ] 계정을 설정했으니 해당 계정으로 작업을 하면 된다.



     - clone 이후 디렉토리를 살펴보면 위와 같다.



2. gitolite.conf

     - repository 別 권한 설정에 대한 정보는 [ ./conf/gitolite.conf ] 파일에 있다.


     - 참 직관적이고 쉽게 되어있다.
     - 하나씩 알아보자.



3. Permission

     - Gitolite에서 사용할 수 있는 옵션은 다음과 같다.

Permission  Comments
 -  deny
 R  show
 RW  create a ref or fast-forward push a ref. No rewinds or deletes.
 RW+  create, fast-forward push, rewind push, or delete a ref.
 C  create repository.
 RWC  RW but no longer permit creating a ref.
 RW+C  RW+ but no longer permit creating a ref.
 RWD  RW but no longer permit deleting a ref.
 RW+D  RW+ but no longer permit deleting a ref.
 RWCD  RW but no longer permit creating and deleting a ref.
 RW+CD  RW+ but no longer permit creating and deleting a ref.
 M  no longer permit merge.

     - (우쒸 이 놈의 티스토리... 위지윅으로 표 편집하기 짜증나네...)

     - "-", "R" qualifier의 경우는 밑에서 예를 들면서 다시 한 번 설명을 하겠다.

     - "RW" qualifier는 앞으로 나아가는 것은 모두 가능하지만, 지우거나 되돌아가는 것을 허용하지 않는다.
     - "RW+" qualifier는 진정한 모든 기능 할당이다.

     - 단독으로 "C" qualifier를 할당할 경우 repository를 create할 수 있다.

     - "RWC"와 같이 같이 사용되는 "C"와 단독으로 사용되는 "C"는 의미가 다르다!!!

     - 만약 단독으로 사용된 "C" qualifier가 적용되었을 경우,
       다른 qualifier와 같이 사용되는 "C" or "D" permission 내역은 적용되지 않는다.

     - 마지막으로 "M" qualifier가 있다. 이는 merge를 허용하지 않고 싶을 경우에 사용한다고 한다.



4. Structure

     - [ gitolite.conf ] 옵션의 문법(?)은 아래와 같다.

<permission> <zero or more refexes> = <one or more users/user groups>

     - 여기에서 애매한 용어가 나온다. 바로 "refexes"

refexes = a regex that matches a ref

     - 그러면 [ ref ]는 무엇이냐고? 이런 의문을 갖는 분들은 Git을 많이 공부하지 않으신 분이 분명하다!!!
     - [ refs/heads/master ] 이런것 많이 보지 않으셨을런지... ^^

     - 저 위의 "문법"에 대해서 실 사용예를 몇 가지 들어보겠다.

repo wow
     RW    master                      = chani
     RW    refs/tags/v0.[0-9]      = hardworker
     RW    source/                    = iamslave

     - [ RW   master      = chani ]는 "master"라는 브랜치 RW 권한을 chani 계정에게 줘라!라는 의미이다.
     - 그런데, 여기에서 주의할 점이 있다. [ refexes = a regex that matches a ref ] 포인트는 "regex"
     - 그래서 'master' 브랜치 뿐만 아니라 "master21", "master_wow" 등도 모두 해당한다.
     - 그러면 정확히 "master" 브랜치만 지정하려면 어떻게 해야할까? 정답은 "$"

RW    master$     = chani

     - 그 다음 [ RW    refs/tags/v0.[0-9]      = hardworker ]를 살펴보면 tag에 대한 권한 설정도 확인이 된다.
     - 그 다음 [ RW    source/                    = iamslave]를 보면 디렉토리에 대한 권한 설정도 확인이 된다.

     - Gitolite는 기본적으로 명시되지 않을 경우에는 [ refs/heads/ ]가 생략되었다고 판단한다.



5. Group


     - 권한을 주기 위해서 일일이 계정이름을 적어주는 것은 너무 번거롭다.
     - 팀 別 권한을 주고, 그 안에 업무 別 권한을 주는 등의 설정을 위해서 Group 설정을 해보자.

@prj_kernel_repo     = kernel linux
@prj_kernel_user     = chani john

@prj_uboot_repo      = uboot boot               # make uboot
@prj_uboot_user      = miae charlse

@prj_repo               = @prj_kernel @prj_uboot
@prj_user               = @prj_kernel @prj_uboot

     - 여기에서 특이한 점은 repository와 user 그룹을 구분할 방법은 없다.
     - 사용을 할 때에 그 성격이 구분된다.



6, Read but...

     - Permission에서 "-"와 "R"의 용법에 대해서 알아보자.

repo gitolite-admin
   -  =   gitweb daemon
   option deny-rules = 1

repo @all
    R  = gitweb daemon

     - 위 글상자 안의 것을 보면 더 이상 설명이 필요 없을 것 같다.

     - 다만, 주의할 점은 순서이다. "-"가 앞에 위치하고 "R"이 뒤에 와야 한다.



7. Tip

     - Makefile과 같은 중요한 파일을 제어하는 방법에 대해서 알아보자.

@professional                 = chani john whatwant charlse
@begineer                      = doosan twins

repo ourproject
     RW                            = @professional @begineer

     RW   source/              = @professional
     -      source/Makefile  = @begineer
     RW   source/              = @begineer

     - 위 내용을 잘 살펴보아야 한다. 포인트는 제일 밑의 2줄!
     - [ source/Makefile ]에 대한 권한을 빼앗고선 [ source/ ]에 대한 권한을 설정해주었다.
     - 순서가 중요하다!



Gitolite를 제대로 멋지게 사용해보자!!!

반응형

'SCM > Git-GitHub' 카테고리의 다른 글

Gitolite - user, repo 추가하기  (14) 2012.05.26
Git 계정 관리 - Gitolite's Repository  (4) 2012.05.20
Git 계정 관리 - Gitolite 설치하기  (23) 2012.05.15
GitWeb + Nginx  (0) 2012.05.09
SSH Public Key - SSH 공개키  (0) 2012.05.04

Git의 기본적인 계정(권한) 관리는 SSH를 따라간다고 앞에서 지겹게 언급했다.

SSH가 훌륭한 놈이라는 것은 분명하지만,
계정 관리에 있어서 부족함이 있는 것 또한 분명하다.

Git에 있어서도 다양하고 디테일한 권한 설정 등이 필요한데,
이 부분을 SSH는 충분히 채워주지 못하고 있다.

그래서, Git을 위한 계정(권한) 관리 도구들이 계속 나타나고 있다.

과거에는 Gitosis 라는 것을 주로 사용했으나 기능이나 사용상의 편의성에 있어서 부족함이 보여서
새로운 Gitolite 라는 것이 나타났고, 최근에는 거의 대부분 Gitolite를 사용하고 있다.

사실 일반적인 경우 Gitosis만 가지고도 대부분 처리가 가능하나,
왠지 더 최근의 보다 더 막강한 Gitolite를 적용하곤 하는 것도 없지 않아 있는 것 같다.
물론 나의 경우에도 마찬가지다! 최신병에 걸린 죄로.... Gitolite에 대해서 연구를 해보겠다!!!




Gitolite를 설치하는 방법은 당연하게도 패키지 설치와 소스 설치가 있고...
여기에서는 소스를 가지고 설치하는 과정으로 설명을 할 것이다.


[ 전면수정 ]
   - 내가 바보같아서인지, 이 놈의 Gitolite에 대해서 친절하게 설명해 놓은 자료가 안보인다.
   - 가끔 친절한척 자세히 적어놓은 것들이 있지만, 따라하다보면 대체 뭘하는 것인지 모르겠는 그런 것이 대부분이다.
   - 더더욱 힘들게 하는 것은 Gitolite가 최근 g2 버전에서 g3로 바뀌면서 설치 과정들이 바뀌었다.
   - 그래서 예전 기억을 더듬어 차근차근 포스팅을 해나가다가... 좌절! 결국 대폭 수정 작업!!! 짜증 확!!! ㅠㅠ




1. Gitolite


     - Gitolite 프로젝트의 홈페이지는 아래와 같다.
          ▷ https://github.com/sitaramc/gitolite
     - 설치 과정에 대한 매뉴얼은 아래와 같다.
          ▷ http://sitaramc.github.com/gitolite/install.html
     - 계정 관리 등에 대해서 요약(?)을 한글로 보고 싶다면 아래 주소로 가라.
          ▷ https://github.com/progit/progit/blob/master/ko/04-git-server/01-chapter4.markdown



2. 시스템(계정) 구성

     - Gitolite를 설치하는 환경을 위해 어떻게 구성해야하는지 살펴보자.


     - 꼭 위와 같이 구성해야하는 것은 절대 아니다.
     - 아래 설명하는 내용을 잘 읽어보고 어떻게 구성해야하는지 각자 결정하면 된다.

     - 위의 직사각형은 각 계정을 의미한다.
     - [ git-repo ] 계정은 Git repository를 운영하기 위한 계정이다.
     - [ gitolite ] 계정은 Gitolite를 관리하기 위한 관리자 계정이다.
     - [ user ] 계정은 그냥 여러분이 사용하는 Ubuntu의 기본 계정이다.

     - 위 그림에 대한 설명은 아래 내용들을 하나씩 따라하면 알 수 있을 것이다.



3. 계정 생성

     - SSH 환경에서 여러 개발자들을 지원해주기 위해서는 Linux 계정을 그 숫자만큼 만들어줘야 했다.
     - Gitolite를 적용하게 되면 Linux 계정을 만들어주지 않고도 Git 계정을 만들어 줄 수 있다.
     - 대표 계정 하나로 나머지를 모두 커버하는 것이다.


$ sudo adduser gitolite
$ sudo adduser git-repo

     - [ gitolite, git-repo ]라는 계정을 추가해주자.



4. Public Key 등록

     - 현재 작업중인 계정에서 다른 계정에 접근하기 위해 Public-Key를 등록해주자.


     - 지금 사용중인 user의 계정에서 gitolite, git-repo 계정으로 ssh 접근을 바로(패스워드 없이) 하기 위해서
       user 계정의 공개키를 넣어주는 것이다.


$ ssh-keygen
$ ls -al ~/.ssh/

     - [ ~/.ssh/ ] 계정의 홈디렉토리 밑에 있는 '.ssh/' 디렉토리 밑의 파일들을 우선 확인하고,
     - [ id_rsa ], [ id_rsa.pub ] 파일들이 안보이면 [ ssh-keygen ]으로 생성을 해주면 된다.

 

$ ssh-copy-id -i ~/.ssh/id_rsa.pub gitolite@localhost
$ ssh-copy-id -i ~/.ssh/id_rsa.pub git-repo@localhost


     - 지금 현재 계정의 공개키를 gitolite, git-repo 계정에 넣어주기 위한 명령이다.


     - 잘 되었는지 검증해보기 위해서는 아래와 같이 직접 ssh 접속을 해보면 안다.

     - 암호를 묻는 과정이 사라졌다.
     - gitolite 계정의 [ ~/.ssh/ ] 경로를 살펴보면 [ authorized_keys ] 파일이 보일 것이다!



5. Gitolite 다운로드 받기

     - 위와같이 계정들을 생성하고 준비를 하고...이제 Gitolite를 설치해보자.
     - 그런데, 어디에 Gitolite를 설치해야할까?!

     - 정답은 repository를 저장할 곳이다! 즉, [ git-repo ] 계정에서 설치를 해야하는 것이다.

 


     - [ git-repo ] 계정에서 Gitolite를 다운로드 받고 설치하면 된다.
 



     - 위 사이트에서 경로를 확인하고... 진행을 계속 해보자.



   - [ git-repo ] 계정으로 작업을 하기 위해서 해당 계정으로 접속한다.
   - [ git-repo ]의 홈디렉토리에서 Gitolite를 clone하면 된다.

   - 그런데, 여기에서 중요한 점을 하나 집고 넘어가야 한다.
   - 웹에서 검색이 되는 Gitolite의 설치가이드 대부분과 지금 현재 상황이 맞지 않는다는 점이다.
   - 그 이유는 버전이 틀리다!!! 기존 Gitolite 대부분은 "g2" 버전이고, 지금은 "g3"다.
   - 그래서 설치 스크립트가 틀리다.
   - 2012.04.17에 g3가 릴리스가 되어서인지, 이와 관련한 자료는 거의 없다.



6. install

     - 다운로드 받은 Gitolite를 설치해보자.


$ ./gitolite/install

     - 그냥 'install'만 실행하면 일단 끝이다.

     - 만약 다른 디렉토리에 설치하고 싶으면 [ ./gitolite/install -to /srv/install/gitolite ]와 같이 사용한다.
     - 여기에서 설치하는 것은 실행할 수 있는 binary들이다.

     - 이제 이어서 'setup'을 해야하는데, 관리자 계정의 공개키가 필요하다.
     - 앞에서 만든 계정 중에서 우리는 [ gitolite ]라는 이름으로 관리자 계정을 만들어 놓았다.


$ ssh gitolite@localhost
$ ssh-keygen

     - 여기서 생성한 공개키를 전송해야한다.



     - [ gitolite ]의 공개키를 [ git-repo ] 계정 어딘가로 전송을 하고자 한다.

     - 위의 경우 ~/.ssh/ 밑에 위치했는데, 꼭 그곳이 아니어도 된다.
     - 관리자로 사용할 계정의 공개키가 Gitolite 설치과정에서 필요로 해서 이렇게 하는 것이다.


$ ./gitolite/src/gitolite setup -pk ./.ssh/gitolite.pub

     - install 후에 사용할 수 있게 된 [ ./gitolite/src/gitolite ] 명령어를 이용하여 setup을 하는데,
     - [ gitolite ] 계정의 공개키를 관리자로 등록하는 것이다.

     - Gitolite는 하나의 repository로 관리를 하게 된다. 위 화면에서 보는 바와 같이 [ gitolite-admin.git ]이 그것이다.
     - 해당 repository에 자료를 넣을 수 있는 관리자는 방금 전에 등록한 공개키로 인하여 [ gitolite ] 계정이다.

     - 친절하게도 테스트 해볼 수 있게 [ testing.git ] repository도 제공을 해준다.



7. clone

     - [ gitolite-admin.git ] repository를 clone 받아서 확인을 해보도록 하겠다.


$ ssh gitolite@localhost
$ mkdir repositories

     - Gitolite에 관리자로 등록시킨 [ gitolite ] 계정으로 접속하자.
     - clone 받을 디렉토리도 'repositories'라는 이름으로 만들어두자.

▶ 여기에서 Gitolite를 처음 접하는 분들을 위한 질문~!!!!!!!
     - 위와 같이 만든 [ Gitolite를 적용한 Git ]에 어떻게 접근을 할까?!

▷ 정답은 대표 계정 1개로 접근을 한다!
     - 이 포스팅 내용대로라면 여기에서는 [ git-repo ] 계정


     - [ gitolite ] 계정이 [ git-repo ] 계정에 접근을 하려고 하면,
     - 'gitolite' 계정의 private key에 대응하는 public key를 찾는데,
     - [ Gitolite ]가 이 부분에 개입을 해서 등록된 public key를 기반으로 권한을 확인하고
     - repository에 대한 접근 권한을 조정한다.

     - 이 부분에 대해서 오랫동안 고민해보질 못해서인지 쉽게 설명은 안되는데, 위의 글과 그림을 잘 봐보면....^^

     - 일단, clone을 해보자.


$ cd ~/repositories
$ git clone git-repo@localhost:gitolite-admin.git


     - 지금 현재 사용자 계정은 [ gitolite ]이다.
     - Gitolite에 관리자로 public key를 등록한 계정도 [ gitolite ]이다.
     - 그런데, clone을 할 때 [ git-repo ] 계정으로 접근을 했다. 응?!

     - 위에서 말한바와 같이, Gitolite를 사용할 때에는 무조건 대표 계정을 사용한다.

     - 그러면, 다른 계정에서 똑같이 하면 어떻게 될까?


     - Gitolite에 별도로 계정 등록을 하지 않은 사용자 chani 계정에서 접근을 할 때인데... 당연히 접속 불가~!!!


     - [ chani ] 계정이 'git-repo' 계정으로 접근을 하지만,
     - Gitolite가 등록된 공개키를 확인을 하는데 등록된 것이 없기에 접근을 거부하게 된다.




이번 포스팅을 하면서 너무 오랜 시간이 걸렸고, (헷갈리기도 하고 주말에 열심히 놀기도 하고 사고도 있고.....)
포스팅 내용 자체도 너무 길어지는 관계로 여기까지만해서 설치에 대해서 마무리!!!

계정 관리하는 것이나, admin 환경 설정하는 것이나 그러한 것들은 다음 포스팅으로.......


아자~!!! 오늘 두산 이겼다.... 그런데, 좀 부끄럽게 이겼다.... 프로들이 어이없는 실수들을 서로 남발하는....ㅋㅋㅋ

반응형

'SCM > Git-GitHub' 카테고리의 다른 글

Git 계정 관리 - Gitolite's Repository  (4) 2012.05.20
Git 계정 관리 - Gitolite 설정하기  (3) 2012.05.19
GitWeb + Nginx  (0) 2012.05.09
SSH Public Key - SSH 공개키  (0) 2012.05.04
Git Branch (브랜치) - Remote Ⅲ (생성, track)  (0) 2012.05.01

Git Repository를 셋팅해놓고 보면 자주 나오는 요청 사항 중 하나가 바로 Web 환경이다.
소스 코드 등을 Web 환경에서 제공해주길 바라는 것이다.


Git은 기본적으로 GitWeb이라는 것을 제공해준다.
Redmine을 사용한다면 GitWeb 대신 Redmine에서 제공해주는 '저장소' 메뉴를 활용할 수도 있다.


여기에서는 GitWeb을 설치하는 방법을 알아보겠다.
단, 일반적인 설치 방법과 다른 점은 웹서버를 Apache가 아니라 Nginx를 이용해보겠다.

그렇다고, 뭐가 많이 다른 것은 아니다.
CGI만 구동할 수 있다면 어떤 웹서버를 사용해도 무관할 것으로 보인다.


1. build

   - 일단은 Git의 Source Code가 필요하다.
   - 이번 기회에 Git 업그레이드도 할 겸 새로 다운로드 받아보자.



   - Git의 경우 major 업그레이드는 가끔이지만, Minor 업그레이드는 자주 올라오고 있다.

 


$ tar zxvf git-1.7.10.1.tar.gz
$ cd git-1.7.10.1/

$ make GITWEB_PROJECTROOT=/srv/repository prefix=/usr/local all
$ sudo make prefix=/usr/local install

   - 압축을 풀고, make를 진행하면 된다.
   - 기존과 다른 점은 [ GITWEB_PROJECTROOT=/srv/repository ] 옵션이 추가되었다.
     → repository가 있는 위치를 지정해주는 부분이다.
   - make 옵션의 제일 뒤에 [ all ]이 있는데, 모든 것으로 지정했기 때문에 GitWeb 관련 부분도 포함이 되어버린다.
     → GitWeb만을 위해 make 할 때에는 [ all ] 대신에 [ gitweb/gitweb.cgi ]라고 적어주면 된다.


$ git --version

   - 설치된 결과를 확인해보자.




2. copy

   - 생성한 파일들을 웹서버로 구동하기 위해 일단 위치 정리부터 해보자.


$ sudo cp -Rf gitweb /srv/www/

   - 우리가 관심이 있는 파일은 [ gitweb.cgi ]이다.



3. webrick

   - 잘 동작하는지 한 번 살펴보자.


$ git instaweb --httpd=webrick

   - 아무곳에서나 실행을 하면 위와 같이 에러가 발생을 한다.
   - git repository 안에서 실행을 하면 된다.


   - "bare1repo.git" 디렉토리 안에서 실행을 하지만, 그 상위 디렉토리에서 실행이 된다. (이유는 ???)


   - 정말 보기가 편하다. 'CLI' 환경에 비해서 다양한 정보를 보기가 너무 좋다.



4. Nginx

   - 이 블로그의 포스팅을 계속 보고 계시는 분들은 알겠지만, WAS로 Nginx를 계속 사용하고 있다.
   - Redmine, Munin 모두 Nginx를 기반으로 구동을 했었으니, GitWeb도 Nginx로 구동을 하고자 했다.

   - 그런데, 문제는 이쒸 정말 아우~ 정말 빡치게도.... Nginx와 GitWeb은 친하지 않다.

   - GitWeb이 'CGI'로 되어있는데, Nginx는 기본적으로 FastCGI를 지원하지 않는다.
   - 거기에다가 더욱 더 큰 문제는 기본적인 CGI가 아니라 Perl 기반으로 되어있는 GitWeb이다.


$ sudo apt-get install libfcgi-perl

   - Perl기반의 CGI 지원을 위해 [ libfcgi-perl ]을 설치해주자.


$ sudo apt-get install fcgiwrap spawn-fcgi

   - 추가적으로 2가지 더 설치를 해주자.


$ sudo nano /opt/nginx/conf/nginx.conf

    server {
        listen 9000;

        location @gitwebhandler {
            rewrite /gitweb /gitweb.cgi;
        }

        location /gitweb {
            alias /srv/www/gitweb;
            index gitweb.cgi;

            try_files $uri $uri/ @gitwebhandler;
            expires 10d;

            location ~* \.(css|png|gif|ico|jpe?g|js) {
                expires 31d;
            }

            location ~ .cgi$ {
                root /srv/www/gitweb;
                if (!-e $request_filename) { rewrite / /gitweb.cgi last; }
                expires off;

            #    fastcgi_pass unix:/var/run/fcgiwrap.socket;
                fastcgi_pass 127.0.0.1:8999;
                fastcgi_index gitweb.cgi;
            #    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
                fastcgi_param SCRIPT_NAME gitweb.cgi;
            #    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param SCRIPT_FILENAME /srv/www/gitweb/gitweb.cgi;
                include /opt/nginx/conf/fastcgi_params;
            }
        }
    }

   - 위와 같이 하면 일단 구동은 할 수 있는데, 제대로 동작은 하지 않았다.
   - 첫 화면은 잘 나오는데, repository 등을 클릭했을 때 정상 동작하지 않는다.

   - 몇 일을 해결하려고 애를 썼는데, 해결이 안된 상태로 그냥 그대로 포스팅한다.




다른 진도를 나가야하는데, 여기에 너무 많은 시간을 투자하게 되어 해결하지 못하고 마무리 하게 되어 정말 아쉽다.
나중에라도 꼭 해결을 해보도록 하겠다.

Apache2 환경에서는 곧 추가하도록 하겠다.

이상~

반응형

Git에서 계정 別 권한을 주기 위해서 대부분의 경우에 사용하는 SSH,
하지만 push 등을 할 때마다 패스워드를 입력하기가 상당히 귀찮다.

편하게 할 수 있는 방법이 없을까? 당연히 있다!


1. .ssh 확인

   - ~/.ssh/ 경로를 확인하자.


$ ls -al ~/.ssh/

   - ssh 키 파일이 없다.



2. ssh-keygen

   - ssh 키 파일을 생성하자.


$ ssh-keygen

   - [ ssh-keygen ] 명령을 실행하고 그냥 다 엔터를 치면 된다.


$ ls -al ~/.ssh/

   - 다시 한 번 [ ~/.ssh/ ] 디렉토리 안의 파일을 확인하면 위 스크린샷과 같이 파일 2개가 생겼다.
   - 확장자를 보면 알겠지만 [ id_rsa.pub ] 파일이 바로 공개키다.



3. authorized_keys

   - 등록된 사람이라면 그냥 바로 접근을 허용하기 위해서는 authorized_keys 파일을 만들어야 한다.


$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

   - 위의 샘플의 경우는 git repository의 owner가 "chani"이고 사용자 역시 "chani"인 경우다.

   - "chani" 계정에 ssh로 접근하는 사용자가 등록된 사용자인지 확인을 하기 위해서는 "authorized_keys"을 참조한다.



   - [ authorized_keys ]가 등록되어 있으면, 위와 같이 패스워드를 묻지 않고 바로 진행이 된다.



   - 그런데, 위와같이 [ authorized_keys ] 파일을 만들어주는 것은 대단히 원시적인 방법이다.

$ ssh-copy-id -i ~/.ssh/id_rsa.pub chani@localhost

   - 위와 같이 하면 뒷쪽에 있는 타겟에 [ authorized_key ] 파일을 생성한다!
   - 참고!



곧 알아보려고 하는 gitolite를 활용한 Git 계정관리에서도
기본적으로 활용하는 "SSH 공개키" 사용 방법에 대해서 알아보았다.

이 부분은 Git에서만 적용되는 것이 아니라, SSH 환경에서 기본적으로 적용하는 방식이다.

잘 알아두면 리눅스 환경에서 많은 도움이 될 것이다.
반응형

지금까지 remote repository에서의 branch에 대해서 살펴보면서,
remote repository에 branch를 추가하는 것에 대해서 아직도 알아보지를 않았다.


1. remote branch 생성

   - remote repository 內에 branch를 생성해보자.


$ git branch develop
$ git checkout develop
$ git push origin develop

   - remote repository에 원하는 branch를 만들고 싶다면 원하는 이름으로 push를 해버리면 된다.
   - 위와 같이 궂이 꼭 별도의 branch를 만들어서 push를 할 필요는 없지만,
     예시와 같이 같은 이름의 branch를 만들어서 그 이름으로 push를 통해서 remote branch를 생성하는 것이 편하다.


2. clone

   - remote repository가 제대로 되어있는지 확인하기 위해서 새로 clone을 한 번 해보자.


$ git clone chani@localhost:/srv/repository/bare1repo.git
$ cd bare1repo
$ git branch -a



3. tracking

   - local master branch에서 작업을 한 뒤에 [ git push ]를 하면 알아서 'origin/master'에 들어간다.
   - 이는 서로간에 tracking 관계가 설정되어 있기에 그냥 되는 것이다.


$ git checkout --track origin/develop
$ git config -l

   - remote에 위치하고 있는 'origin/develop' branch를 따르는 branch를 local에 생성을 하고 싶다면,
     [ git checkout --track origin/develop ] 명령을 사용하면 된다.
   - 그러면, local 에서 'develop' 이라는 이름으로 branch를 생성하고, checkout 까지 한다.
   - 더불어, 핵심 포인트인 'develop ~ origin/develop' 사이에 tracking 기능이 설정이 된다.

   - tracking 관계를 확인하기 위해서는 [ git config -l ] 명령을 사용하면 된다. 뒤의 옵션은 "L"이다.
   - 밑 부분의 branch 를 살펴보면 연결관계를 확인할 수 있다.



4. checkout track

   - [ --track ] 옵션으로 생성을 하게 되면 local branch 이름을 remote branch 이름과 똑같이 설정을 한다.


$ git checkout -b hotfix origin/develop

   - 위와 같이 'hotfix'라는 이름으로 'origin/develop'을 tracking 하는 local branch를 생성하였다.



5. delete

   - 만들었으면 지우는 방법을 알아볼 차례다.


$ git push origin :develop

   - [ push ] 명령을 이용하여 remote branch를 삭제하면 되는데, branch 이름 앞에 [ : ]를 붙이면 된다.
   - 지금까지의 명령 방법과는 조금 다른 방식이니 주의해야할 것 같다.



tracking 관계에 있게 되면 기본적으로 둘 사이에 밀접한 관계를 맺고 있다는 의미가 된다.
해당 branch에서 작업한 것은 그 관계에 있는 remote branch에 반영을 하겠다라는 의미가 되기 때문이다.

이는 잘 이용하면 상당히 편하게 작업을 할 수 있을 것이다.


아름다운 근로자의 날이다.
근로자 여러분 모두 파이팅~!!!
반응형

'SCM > Git-GitHub' 카테고리의 다른 글

GitWeb + Nginx  (0) 2012.05.09
SSH Public Key - SSH 공개키  (0) 2012.05.04
Git Branch (브랜치) - Remote Ⅱ (Pull)  (0) 2012.04.30
Git Branch (브랜치) - Remote Ⅰ (Fetch)  (0) 2012.04.30
Git Branch (브랜치) - Local Ⅴ (ETC)  (0) 2012.04.24

+ Recent posts