회사에서 repo를 사용해야할 개발팀이 Windows 환경에서 개발을 한단다. 이런...

Windows는 테스트 환경도 마땅치 않은데...


그나마 다행인 것은 친절하게도 Windows 환경에서

repo를 사용할 수 있도록 노력을 해주는 사람들이 이미 있다는 것이다 ~ !!! 쌩유 !!!


    ▷ https://github.com/esrlabs/git-repo


이하 내용은 MS Windows 7 64bit 환경에서 테스트 되었다.



1. Precondition


    ① git

        - 여러 종류의 SW가 존재하지만, 표준 제품(?)으로 설치하자 !!!

        ▷ https://git-scm.com/download/

        - 설치는 기본 설정값으로 진행하되 아래 부분은 조금만 신경쓰자





        - 특히 아래와 같이 Enable symbolic links 항목을 꼭 체크하자



    ② Python

        - repo는 python으로 작성된 스크립트이므로, 당연하게도 python이 설치되어 있어야 한다

        ▷ https://www.python.org/downloads/

        - Python 3에서도 실행이 되지만, 아직은 호환성을 고려했을 때 2.7 버전으로 설치하자


        - 가능한 기본 설정값으로 설치를 진행하자



2. Install


    ▷ Ubuntu 환경에서와 마찬가지로 2가지 방법으로 설치 진행할 수 있다.


    (방법 1) curl

        - 평범한(?) 방법이다~


$ cd ~

$ mkdir ./bin

$ curl https://raw.githubusercontent.com/esrlabs/git-repo/stable/repo > ./bin/repo

$ curl https://raw.githubusercontent.com/esrlabs/git-repo/stable/repo.cmd > ./bin/repo.cmd

$ export PATH=$PATH:~/bin


    (방법 2) git clone

        - git으로 존재하는 배포판인데, git clone을 해야지.... ^^


$ cd ~

$ git clone https://github.com/esrlabs/git-repo.git

$ cd ./git-repo

$ git checkout -b stable origin/stable

$ export PATH=$PATH:~/git-repo


    (공통) PATH

        - 영구적으로 실행 경로를 등록하기 위해서 아래와 같이 해보자


$ cd ~

$ nano ./.bashrc


        - 각자 필요한 경로로 작성하면 된다


export PATH=$PATH:~/bin

export PATH=$PATH:~/git-repo



3. How to #1


    □ precondition

        - git을 사용하기 위한 사용자 정보 입력과 작업 공간(directory)를 만들고 시작하자 (기본 경로는 필자 개인 취향이다)


$ cd /srv/workspace

$ mkdir ./whatwant

$ cd ./whatwant


$ git config --global user.name "whatwant"

$ git config --global user.email "whatwant@gmail.com"


    ① init

        - 작업 공간(directory)을 작업하기 위한 상태로 만드는 과정이다


$ repo init -u https://github.com/whatwant-school/manifest --no-clone-bundle


    ② sync

        - 실제 사용할 repository를 가져오는 과정이다


$ repo sync --no-clone-bundle




반응형


long, long time ago ...

필자가 안드로이드 플랫폼과 토발즈 형님의 Git에 한참 빠져있을 때 알게된 repo라는 희한한(?) 도구 !!


안드로이드 플랫폼이 여러개의 repo로 구성되어 공개되다보니,

한 번에 내려받기에 불편함이 많았고, 그래서 google 님께서 만들어 배포한 repo라는 도구.



여러 개의 repository로 구성된 프로젝트를 위해서 git 에서는 submodule이라는 기능을 지원해주고 있다.

최근에 많이 좋아졌다고는 하는데... 개인적으로 안좋아한다. 너무 어렵고 햇갈려서..... ㅠㅠ


그렇다고 해서 repo가 사용하기에 엄청 쉬운 것은 아니지만

그래도 개인적으로는 다수의 repository를 관리하는 용도로는 괜찮은 도구라고 생각된다.


아래 참고자료를 바탕으로 한 번 정리해보겠다.


▷ 소스코드 URL : https://gerrit.googlesource.com/git-repo/

▷ 가 이 드  URL : https://source.android.com/setup/develop/repo

▷ 설치방법 URL : https://source.android.com/setup/build/downloading#installing-repo


매뉴얼과는 조금 진행 방식에서 차이가 날 수는 있다.

필자 회사 사정상.... curl 등을 통한 외부와의 연결(?)이 수월하지 않기에...

별도의 온라인(?) 없이 편하게 사용할 수 있는 방향으로.... ^^



이하 내용은 Ubuntu 14.04 64bit 환경에서 테스트 되었습니다.



1. Precondition


    ① git

        - 당연하게도 git은 미리 설치가 되어있어야 한다.


$ sudo apt-get install git



    ② bundle

        - repo에서는 git 기능 中 bundle이라는 것을 사용한다. 일단, 이런게 있다라는 것만 알아두면 된다

        - 참고 : https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Bundle



    ③ proxy

        - proxy를 사용하는 network 상황이라고 하면, 다음과 같이 설정이 되어 있어야 한다


export HTTP_PROXY=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port>

export HTTPS_PROXY=http://<proxy_user_id>:<proxy_password>@<proxy_server>:<proxy_port>



2. Install


    ▷ repo를 설치하는 경로는 각자 알아서 하면 되지만, 필자의 경우 개인적인 취향으로 "/srv/install/repo/" 경로로 잡았다.

    ▷ 아래 두가지 방법 中 개인적인 취향에 따라 선택하면 된다.


    (방법1) curl

        - 일반적으로 알려진 방법으로써 대부분 이렇게 가이드 되고 있다.

        - curl을 이용해서 다운로드 받은 후, 실행권한 주고, 경로에 추가해서 어디서나 실행할 수 있도록 하는 방법이다.


$ cd /srv/install/repo/

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ./repo

$ chmod a+x ./repo

$ export PATH=/srv/install/repo:$PATH


    (방법2) git clone

        - 그냥 repo 프로젝트를 그대로 다운로드 받아서 사용하는 방법이다.

        - repo 업그레이드 같은 것을 할 때 유리할지도... ?!


$ cd /srv/install/

$ git clone https://gerrit.googlesource.com/git-repo

$ cd ./git-repo

$ git checkout -b stable origin/stable

$ export PATH=/srv/install/git-repo:$PATH



3. manifest


    ▷ 여러 repository들에 대한 정보를 관리하기 위한 파일이 바로 manifest 파일이다.

    ▷ 필요한 정보를 저장하는 방법을 알아보자.


    □ sample

        - repo의 가장 표본이 되는 android 에서 사용되는 manifest 파일의 일부를 아래와 같이 뽑아보았다.


<?xml version="1.0" encoding="UTF-8"?>

<manifest>

    <remote  name="aosp"  fetch=".."   review="https://android-review.googlesource.com/" />

    <default revision="master"   remote="aosp"   sync-j="4" />

    <project path="build/make" name="platform/build" groups="pdk" >

      <copyfile src="core/root.mk" dest="Makefile" />

      <linkfile src="CleanSpec.mk" dest="build/CleanSpec.mk" />

    </project>

    <project path="build/blueprint" name="platform/build/blueprint" groups="pdk,tradefed" />

</manifest>


    ① <remote />

        - 가장 중요한 기본적인 프로젝트 정보를 적는 곳이다.

            . name : remote 별칭

            . fetch : repository들을 받아올 server 정보

            . review : review를 요청할 server 정보


    ② <default />

        - 뒤에 나올 project에서 사용될 기본 설정값을 적는 곳이다.

            . revision : default branch name

            . remote : default remote name

            . sync-j : repository 정보를 내려받을 때, 동시에 몇 개씩 할 것인지...


    ③ <project />

        - 개별 repository에 관련된 정보를 적는 곳이다.

            . name : server 에서 repository 경로

            . path : local에 실제 저장될 경로

            . group : repository들을 묶음으로 관리하기 위한 별칭

            . revision : sync 한 뒤에 HEAD가 될 commit id


    ④ <copyfile />

        - 파일 복사가 필요한 경우에 사용할 수 있다.

            . src : 복사할 원본 파일 경로

            . dest : 복사될 타켓 파일 경로


    ⑤ <linkfile />

        - 링크 파일 생성이 필요한 경우에 사용할 수 있다.

            . src : 링크될 원본 파일 경로

            . dest : 타겟 링크 파일 경로



4. how to #1


    ▷ 모든 명령어(옵션?)를 공부한다는 것은 말도 안되는 것이고... 몇 가지 시나리오를 가지고 따라해봐야 할텐데 ... 일단 한 번 


    □ precondition

        - git을 사용하기 위한 사용자 정보 입력과 작업 공간(directory)를 만들고 시작하자 (기본 경로는 필자 개인 취향이다)


$ cd /srv/workspace

$ mkdir ./whatwant

$ cd ./whatwant


$ git config --global user.name "whatwant"

$ git config --global user.email "whatwant@gmail.com"


    ① init

        - 작업 공간(directory)을 작업하기 위한 상태로 만드는 과정이다


$ repo init -u https://github.com/whatwant-school/manifest --no-clone-bundle


        - 뒤의 "--no-clone-bundle" 옵션을 빼도 실행에는 지장이 없지만, 에러 메시지 보기 싫어서 넣었다.

        - 'repo init'을 실행하게 되면, git-repo repository를 clone 받게 되는데...

          회사에서는 이 부분을 좀 수정해야할 수도 있을 것 같다. 나중에 하게 되면 그 때 다시 포스팅을~^^


    ② sync

        - 실제 사용할 repository를 가져오는 과정이다


$ repo sync --no-clone-bundle


        - 자꾸 "--no-clone-bundle" 옵션을 넣는 것도 귀찮으니... 회사에서는 이 부분도 기본값을 수정하면 편할 것 같다는 느낌이...




이번 포스팅은 여기까지만 ... 뒷 부분 이야기는 필요에 따라서 ... ^^


반응형

어이없게도 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

+ Recent posts