레이블이 SCM-Repo인 게시물을 표시합니다. 모든 게시물 표시
레이블이 SCM-Repo인 게시물을 표시합니다. 모든 게시물 표시

12/04/2020

Gerrit(Git Review)

1. Gerrit(Git Review) 

이전부터 Git Review의 기능 궁금했는데 정확한 사용용도를 잘 몰랐으며, 최근 다시 repo를 사용하면서 다시 용도가 궁금하여 정리하려고 
검색했더니, 너무 많은 좋은 자료들이 많아 사용용도를 쉽게 알게되었다. 

아래 글을 읽어보면, 프로그래머의 Source를 Review하여, Source를 관리해주는 기능으로 보이며, 사용해보지는 않았지만, 
대충 이기능으로 회사마다 조금씩 정형화된 Code Convention 기능을 지킬수 있는 기능으로 보이며,  
더불어 글을 읽어보면, Source에 점수 주어 관리한다고 하는데, 어떻게 소스를 자세히 검토하는지와 문제가 되는 코드들을 찾아 
자동으로 검토를 해준다고 하니, 각 기능들이 궁금하다. 

별도로 추가도 소스검증기능도 가능할 것 같은데, 나중에 시간이 되면 한번 설치를 해보고 사용을 해봐야 자세히 알것 같다. 

네이버의 Git Review 자세한 설명 
  https://d2.naver.com/helloworld/6033708

Git Review , Code Review라는 기능이라고 하는데, 검색을 더 해보고, 곰곰히 생각을 해보면, 소규모 프로젝트에는 필요는 없을 것 같다.


1.1 Google의 Gerrit 기본구조

우선 두명의 개발자 개발하고 공인된 Repository를 공유한다고 한 후 이를 CI를 Jenkins로 별도의 Build Server로 사용하면 구성될 것이다.
네이버는 CI를 Jenkins로 위주로 구성했다고 한다. 
구글은 CI를 Jenkins 대신 Bazel을 사용한다고 하는데, 아직 사용을 해보지 못했다. 


https://gerrit-review.googlesource.com/Documentation/intro-how-gerrit-works.html



개발자는 Push로 고친소스를 올리면, Reviewer 이를 받아 확인 후 검증하고 최종적으로 Submit되는 구조이다.
Reviewer들은 Google을 보면 같이 일하는 Co-Worker들인 것으로 보이는데, 많은 Reviewer들이 존재하며 어떻게 선정이 되는지 구성단계가 궁금하다.
본인이 원하는 사람에게만 Review를 하는 것인지, 아니면, 단계가 별도로 존재하는지, 기타 등등 부분이 궁금하다. 


https://gerrit-review.googlesource.com/Documentation/intro-how-gerrit-works.html


Gerrit(Git Review)를 사용하고자 하면 상위와 같이 Git Repository 와 Gerrit(Git Review)가 같이 존재해야하는데, 
Github와 같이 외부 Repository를 사용한다면, 그 방법도 알아야 할 것 같은데, Github도 보면 Code Review 기능을 별도로 제공해주고 있다.

Code Review로 각 검색을 해보면, 각각의 Gitlab / Bitbucket / Github 다 존재하는 것으로 보인다. 

Gerrit(Git Review) 동작그림


1.2 AOSP(Android Open Source Project) Review

우선 Google에서 어떻게 사용하는지 궁금해서 아래 사이트를 전부 가입 후 Code Review 기능을 확인 
AOSP를 보면 CHANGE 구성에 따라 Open / Merge/ Abandoned 되는데, 각 변화마다 Code Review를 하도록 한다. 

  1. Open: Code를 수정하여 제안 
  2. Merge: 두 개의 Branch들을 합치는 것 
  3. Abandoned: 삭제되는 부분 (생략)

  • CHANGE->OPEN 기능 (기능추가하여 넣어 Review 단계)
각 개발자가 소스를 수정하여, 각 옵션을 설정후 수정된 소스를 Reviewer에게 제안하는 단계로 보인다. 



  • CHANGE->OPEN-> Subject (각 세부이슈)
구글의 Android Gerrit를 보면 reviewr가 한명이 아니라 보통 1명 이상으로 구성으로 하는 것 같으며, 여러개의 옵션이 존재한다  


https://android-review.googlesource.com/c/platform/frameworks/base/+/1502382

상위는 각 이슈에 대한 부분이며, 각 기능은 정확하게 다 파악하지 못했지만, 자동 Submit 부터 이를 검증 그리고, 
LINT 사용여부 비롯하여 다양한 사람에게 Review를 통해 검증부터 우측에 연관된 부분을 우측에 링크를 비롯하여, 
아래에는 이 이슈에대한 소스의 히스토리를 제공해주고 있다. 

구조를 보면, 자동소스 검토는 LINT 와 Treehugger Robot 사용하는 것으로 보이며, 많은 동료들이 검증 하는 것으로 보이며, 
Gerrit이 소스 검토를 비롯하여, 각 기능에 대한 좋은 Community 역할을 해주는 것으로 보인다. 


  • CHANGE->MERGE  
각 개발자가 소스 Confirm이 되고 최종적으로 두 개의 Branch가 각각 Merge할 것이며, 이를  Reviewer 설정하여 이를 점검한다. 



  • CHANGE->MERGE->Subject (각 이슈)  
각 개발자가 소스 Confirm되었고, 이를 실제 하나로 합치는 작업인데, 주로 이부분에서 많은 문제가 발생할것이다. 
개별소스는 각 테스트를 했으나, 소스가 합쳐지면서 생기는 문제들이 주로 일텐데, 이런부분도 각 Review를 통해 하는 것으로 보인다. 



Treehugger Robot
Git의 Tree를 관리해주는 Robot으로 보이는데, 추후에 직접 Gerrit를 설치 후 기본으로 들어있는지 외부 Robot인지 봐야 할 것 같음 

LINT
소스검증 Tool로 이용이 되며, Google에서 사용중 


Android Git Review System 확인
  https://android-review.googlesource.com/

Gerrit Git Review 확인 

AOSP(Android Open Source Project)


1.3 Repo 설명 

Repo 사용법은 아래의 Google Manual을 보면 될 것 같으며, 추후 분석은 아래 예제를 보면 될 것 같다. 
추후 Repo 기반으로 Project를 관리를 할 경우 나중에 다시 한번 제대로 세부사용법을 자세히 알야하 할 것 같다. 


Repo 사용예제 


1.4  GIT 관리 와 Gerrit 관리 문서 


구글문서들로 Git에 대한 기본 Concep 부터 세부문제사항에 대한 예제가 자세히 설명되어있으며, Gerrit에 대한 실제 사용법 및 예제가 나와있다. 

정리가 너무 잘되어 있어 보기 및 이해하기가 더욱 수월하지만, 막상 사용하려면 골치 아픈것 같다. 

Git explained: Git Concepts and Workflows (필독 및 이해)


2. Gerrit 설치 및 기본실행 확인


현재 Gerrit 의 필요성은 거의 없지만, 일단 설치 해보고, 실행하여 구성을 확인을 해보자. 

  • 설치전 확인사항 
  1. Open JDK 설치
  2. Hostname 설정 


  • Gerrit  기본설치 
Google의 Gerrit 메뉴얼대로 간단하게 설치 및 테스트

$ wget https://gerrit-releases.storage.googleapis.com/gerrit-3.1.3.war 

$ mkdir gerrit_test
$ 
$ export GERRIT_SITE=`pwd`/gerrit_test
$ echo $GERRIT_SITE

// 실행 후 GERRIT_SITE에 각 파일 및 관련구성이 설치되며 제대로 되면, 아래 Config의 HTTP로 접속가능 
$ sudo java -jar gerrit*.war init --batch --dev -d $GERRIT_SITE

$ ls gerrit_test/  // 자동생성되며, 아래 설정도 자동으로됨 
bin  cache  data  db  etc  git  index  lib  logs  plugins  static  tmp

$ tree -d -L 3 --charset unicode gerrit_test   // Gerrit 의 기본구조 
.
|-- bin     // Gerrit 의 Service 기능 
|-- cache   // Gerrit 의 Cache  
|-- data
|-- db       // Gerrit 의 DataBase로 Account 관리 
|-- etc      // Gerrit 의 설정부분 
|   `-- mail
|-- git             // Gerrit 의 BasePath 설정되며, git 정보만 생성됨
|   |-- All-Projects.git
|   |   |-- branches
|   |   |-- hooks
|   |   |-- logs
|   |   |-- objects
|   |   `-- refs
|   `-- All-Users.git
|       |-- branches
|       |-- hooks
|       |-- logs
|       |-- objects
|       `-- refs
|-- index
|   |-- accounts_0011
|   |-- changes_0057
|   |   |-- closed
|   |   `-- open
|   |-- groups_0008
|   `-- projects_0004
|-- lib
|-- logs
|-- plugins
|-- static
`-- tmp
    `-- gerrit_7861426947991176346_app

  • 설치된 Gerrit 기본실행확인 
상위 ASOP Git Review 와 거의 유사한 구조로 구성되어 실행됨



  • 상위 Sin in Admin으로 로그인 후 Repository에서 각 TEST Project 생성 
Repository를 추가하면,  상위 git directory에 Git 새로 생성되고, 관리가 시작되며, 생성시 아래와 같이 다양한 옵션들을 줄 수 있다.  



  • Gerrit Project 생성법 
basepath는 상위 git 디렉토리를 말하며, 그 기반으로 생성 

  • Gerrit Project 생성후 기본사용법
Gerrit의 기본 사용법인 것 같으며, 이 기반으로 추후 사용해봐야 할 것 같다.


  • Gerrit 전체설정 확인 
설정을 변경한 후에는 반드시 gerrit를 restart 해줘야함 
//hostname:8080으로 접속가능 및 기본 Project는 git 
$ cat  $GERRIT_SITE/etc/gerrit.config  // 자동생성되며, 아래 설정도 이미 JDK 와 Hostname을 설정했음 
[gerrit]
        basePath = git
        canonicalWebUrl = http://voyage:8080/
        serverId = 122d56c1-e454-4468-b7f0-68bc8c27f593
[container]
        javaOptions = "-Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance"
        javaOptions = "-Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance"
        user = jhlee
        javaHome = /usr/lib/jvm/java-8-openjdk-amd64/jre
[index]
        type = lucene
[auth]
        type = DEVELOPMENT_BECOME_ANY_ACCOUNT
[receive]
        enableSignedPush = false
[sendemail]
        smtpServer = localhost
[sshd]
        listenAddress = *:29418
[httpd]
        listenUrl = http://*:8080/
[cache]
        directory = cache
[plugins]
        allowRemoteAdmin = true


Google Gerrit(Git Review) Config


  • Gerrit Service 기본제어 
아래 처럼 쉽게 gerrit.sh Service를 제어가 가능하며, 부팅시 자동실행하고자 하면 init Script에 추가 
// Gerrit Service 중단/시작/재시작
$ $GERRIT_SITE/bin/gerrit.sh stop
$ $GERRIT_SITE/bin/gerrit.sh start
$ $GERRIT_SITE/bin/gerrit.sh restart


기본 Quick Gudide를 보면 될 것이며, Install Guid에서 세부내용을 확인 
Gerrit PlugIn들  

2.3 Gerrit 의 Github 연결 

  • Github 사용자를 위한 Gerrit연결방법
상위와 같이 Gerrit를 설치 후 Gerrit 과 외부 Github를 연결하는 방법은 보면, 중간에서 Git을 가로채서 Git 명령어를 수행하여, 
이를 Gerrit이 모두 Github의 최종 Push권한을 갖는 것으로 보이며, 
.git/config 과 git Pull Request (Gerrit에서 지원못함) 부분을 좀 더 확인을 해봐야 할 것 같다. 


  • Github 사용자 위한 Gerrit  
별도의 Gerrit을 설치 없이 사용가능한 것 같은데, 너무 느려서 사용하기를 포기 
  http://gerrithub.io/

  • Github의 Code Review 기능
Github 이외 Gitlab 비롯하여 각각의 Code Review 기능을 제공하고 있으며, 이 기능을 사용하면 될 것 같다. 

8/02/2014

repo 내부의 manifest.xml 구성 및 분석

1. manifest.xml 이란? 

repo를 이용하여 repo init하여 설정할 경우, .repo 구조가 생성이되면서 안에  manifest.xml이 안에 존재하는데, 이 xml 기반으로 소스를 가져온다.
이는 repo의 한 구성이며 이를 기반으로 git를 사용하기에 사용방법을 정확히 인지해야한다.


1.1 manifest.xml 기본구조

manifest.xml은 기본적으로 default.xml로 링크되어 있으며, 기본구성은 XML형태의 구조이며,
아래와 같이 XML이 구성이 되므로, 각 구조의 의미를 알아야한다.

  • manifest.xml 전체기본구조
   
 <!DOCTYPE manifest [

/*
        * ELEMENT : XML 내부의 각 element로 이런식으로 구성 <element >
        * ATTLIST : 각 ELEMENT의 속성리스트로 ELEMENT 내에 설정값 
        * REQUIRED : 필수로 들어가야 하는 값 
        * IMPLIED : 옵션이라고 생각하면 되겠음.
*/

/*
 <manifest > 로 시작한 후 아래의 element들로 구성되며 그 속성설정을 이해하자.
  세부내용은 각 ELEMENT에서 설명
*/

    <!ELEMENT manifest (notice?,
                        remote*,    
                        default?,   
                        manifest-server?,
                        remove-project*, 
                        project*,    
                        extend-project*,
                        repo-hooks?,
                        include*)> //다른 manifest.xml 포함가능하지만 .repo/local_manifests/*.xml`로 쉽게추가

    <!ELEMENT notice (#PCDATA)>

// <remote >  구성되며, 보통 Google의 AOSP와 더불어 다른 것들과 같이 구성 ATTLIST로 각 설정가능

    <!ELEMENT remote EMPTY>
    <!ATTLIST remote name       ID    #REQUIRED> //각 project의 .git/config remote 이름로 사용 (git fetch/push 가능)
    <!ATTLIST remote alias        CDATA #IMPLIED>
    <!ATTLIST remote fetch      CDATA #REQUIRED> // ./repo/projects or ./repo/project-object 안에 git로 구성됨 
    <!ATTLIST remote pushurl      CDATA #IMPLIED>   //remote "push" 가능 
    <!ATTLIST remote review      CDATA #IMPLIED>   // review 으로 Gerrit server 설정시 'repo upload' 가능 
    <!ATTLIST remote revision    CDATA #IMPLIED>   // Git 의 tag 와 branch name 

// <default >  거의 1개만 구성되며, ATTLIST 중 remote 와 revision은 각 default 값 설정

    <!ELEMENT default EMPTY> 
    <!ATTLIST default remote      IDREF #IMPLIED> // 상위 remote element 의 name 중 1개 적용(보통 Google)
    <!ATTLIST default revision    CDATA #IMPLIED> // Git branch/tag , 이 값은 모든 project elelement의 기본값설정
    <!ATTLIST default dest-branch CDATA #IMPLIED> // Name of a Git branch (e.g. `master`), 설정하지 않으면, revision과 동일주소
    <!ATTLIST default upstream    CDATA #IMPLIED>
    <!ATTLIST default sync-j      CDATA #IMPLIED> // 보통 병렬작업을 하기 위해 Job 갯수 
    <!ATTLIST default sync-c      CDATA #IMPLIED> // 받은 Git Branch Sync 설정 true  (revision 속성)
    <!ATTLIST default sync-s      CDATA #IMPLIED> // Sub Project Sync 설정 true
    <!ATTLIST default sync-tags   CDATA #IMPLIED> // 받은 Git Branch Sync 설정 false (revision 속성)

    <!ELEMENT manifest-server EMPTY>
    <!ATTLIST manifest-server url CDATA #REQUIRED>

// 상위의 remote 안에 존재하는 모든 project git을 download 후 < project >  구성되며, ATTLIST 설정가능  

    <!ELEMENT project (annotation*,   
                       project*,                 
                       copyfile*,
                       linkfile*)>
    <!ATTLIST project name        CDATA #REQUIRED> // 실제 상위 remote 중  Git 의 project name이며 unique 해야함                                                         
    <!ATTLIST project path        CDATA #IMPLIED>  // 상위 Git Project을 download 하면 실제 Local PATH 
    <!ATTLIST project remote     IDREF #IMPLIED> // 상위 remote element 의 name에 적용
    <!ATTLIST project revision    CDATA #IMPLIED> // 설정이 없다면 상위 default element 값
    <!ATTLIST project dest-branch  CDATA #IMPLIED>
    <!ATTLIST project groups       CDATA #IMPLIED> // Project가 속한 그룹 , 설정을 안하면, name과 동일
    <!ATTLIST project sync-c       CDATA #IMPLIED> // Number of parallel jobs (git sync)
    <!ATTLIST project sync-s       CDATA #IMPLIED> // Sub Project Sync 설정 true
    <!ATTLIST default sync-tags    CDATA #IMPLIED>
    <!ATTLIST project upstream     CDATA #IMPLIED>
    <!ATTLIST project clone-depth  CDATA #IMPLIED>
    <!ATTLIST project force-path   CDATA #IMPLIED>

/*
< project > 의 Sub 작업으로 동작하며 각 Git Project를 세부 Control 작업 
       < annotation >     
       < copyfile >       파일복사
       < linkfile >       링크파일생성
       < extend-project >     확장
*/

      <!ELEMENT annotation EMPTY> 
      <!ATTLIST annotation name  CDATA #REQUIRED>
      <!ATTLIST annotation value CDATA #REQUIRED>
      <!ATTLIST annotation keep  CDATA "true">

      <!ELEMENT copyfile EMPTY> 
      <!ATTLIST copyfile src  CDATA #REQUIRED>
      <!ATTLIST copyfile dest CDATA #REQUIRED>

      <!ELEMENT linkfile EMPTY>  
      <!ATTLIST linkfile src CDATA #REQUIRED>
      <!ATTLIST linkfile dest CDATA #REQUIRED>

      <!ELEMENT extend-project EMPTY>
      <!ATTLIST extend-project name CDATA #REQUIRED>
      <!ATTLIST extend-project path CDATA #IMPLIED>
      <!ATTLIST extend-project groups CDATA #IMPLIED>
      <!ATTLIST extend-project revision CDATA #IMPLIED>

/*
       ELEMENT-project 제거기능으로 
        - 이름이 중복될때 사용될경우 필요 할 것 같음
        - 불필요한 project 제거할 것 같음 (remote에서 전체 project를 받기때문에 필요 없는 것은제거)
*/

    <!ELEMENT remove-project EMPTY> 
    <!ATTLIST remove-project name  CDATA #REQUIRED>

    <!ELEMENT repo-hooks EMPTY>
    <!ATTLIST repo-hooks in-project CDATA #REQUIRED>
    <!ATTLIST repo-hooks enabled-list CDATA #REQUIRED>

/* 
  다른 manifest.xml을 include가능하여 확장기능 
  이외 localmanifest 도 존재
 */ 

    <!ELEMENT include EMPTY> 
    <!ATTLIST include name CDATA #REQUIRED>
  ]>


  • manifest.xml 에 local_manifests.xml 추가방법
`$TOP_DIR/.repo/local_manifests/*.xml`  추가적으로 element project 와 remote를 확장하기 위해서 local_manifest.xml를 별도로 확장

// element remote 와 project 관련 사항만 가능한것 같음 (remove-project도 확인) 
$ ls .repo/manifests  //다양한 manifests.xml로 구성  
....xml

$ ls .repo/manifests.xml   //manifests.xml (MAIN) include 사용하여 .repo/manifests 중 선택가능 

$ ls .repo/local_manifests
local_manifest.xml         // 2nd 추가됨 (알파벳 순서)  
another_local_manifest.xml // 1st 추가됨 (알파벳 순서)  

$ cat .repo/local_manifests/local_manifest.xml // local_manifest.xml 예제 (remote or project를 추가) 
  <?xml version="1.0" encoding="UTF-8"?>
  <manifest>
    <project path="manifest"
             name="tools/manifest" />
    <project path="platform-manifest"
             name="platform/manifest" />
  </manifest>

더이상 $TOP_DIR/.repo/local_manifest.xml 는 미지원한다고 한다. 

        name   : remote의  unique한 ID설정, 다른곳에서 이 ID를 참조하여 적용
        fetch     : source를  받아올 주소 (git fetch )
        review   : review site로 이전 odroid version에는 존재했음. (repo upload 가능)
        revision  : git branch/tag 의 이름  (e.g. master , 'refs/heads/master')
        push     : git push 

     일단 Git 기반으로 하는 것이며, ./repo 안에 download를 하면, name으로 검색가능 

        remote:   이전에 선언된 remote name 중 설정 (기본값 설정)
        revision:  git branch or tag로 element project의 revision의 기본설정값 
        syn-j:  repo sync시 동시에 여러 작업있는 갯수 설정.
        syn-c:  true 이면, 오직 전체를 sync하는 것이 아니라, git branch만 sync 한다고한다.
                 효율적면에서 사용하는것 같다.
        syn-s: true이면 sub-project와 sync를 한다고 한다.

   *element default는 project의 attribute가 remote가 선언이 되지 않았다면, default사용 

  • element project
  • path:  repo sync후 Local의 PATH 구성 
    name:  unique한 이름, remote의 fetch의 Git repository name 
    remote: remote의 설정하며, 만약없다면, element default 정보사용.
    group: group의 list를 말하며, 선언이 되어 있지 않다면 "notdefault" 설정
        모든 project 선언시는  "all"  각 개별 project group 선택시에는 "pdk" or "pdk,linux"
        repo sync -g로 sync 여부를 결정가능하다.
    revision:  sync가 된후, git의 branch 이름,만약없다면, element default 정보사용.
    기본적으로 repo로 download되어 있으면, local path 기반    


Google의 Repo 관련 세부 Manual 
  https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md


  • Google의 remote 기본구조
기본 remote Google의 AOSP 는 https://android.googlesource.com 구성은 다음과 같이 구성이 되어지며, 각 슬래시로 구분되어진다.
이는 repo sync를 할 경우 ,  ./repo/projects or ./repo/project-object 로 가는데 거의 ./repo/projects 로 안에 존재한다.

일반 Github일 경우는 그냥 project name으로만 찾으면된다. 

{remote_fetch}/${project_name}.git 

아래의 설정이 특히해서 링크 
  https://stackoverflow.com/questions/18251358/repo-manifest-xml-what-does-the-fetch-mean

ODROID manifest.xml 분석


7/31/2014

repo 기본 사용법

1. repo란? 

Android에서 Build를 전체하고자 한다면, PDK(Plaform Development Kit) 알아야 할 기본 Tool이 repo이다.
repo는 python program으로 XML의 기반의 manifest를 이용하여 git project를 묶어서 하나의 project로 관리하고 있다.

repo를 정확히 이해하기 위해서 다음과 같은사항을 알아두자.

  1. manifest.xml의 규칙
  2. git 명령

1.1 Repo 설치 및 설정

처음 repo 가 설치가 되어있지 않았다면, 반드시 download하고 환경설정해야 사용하기가 편한다.
그리고 더불어 python은 설치가 되어야 있어야 한다.
  • repo download 

$ sudo apt-get install curl
$ mkdir ~/bin
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
or
$ curl https://android.git.kernel.org/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

  • repo 환경설정 

$ vi ~/.bashrc or vi ~/.bash_profile or vi ~/.profile  // 가능하면 .profile or .bash_profile 
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

or
$ export PATH=~/bin:${PATH}

  • repo 구성 및 version 확인
repo의 python script를 보고 싶다면, 간단히 vi ~/bin/repo 로 확인.

$ vi ~/bin/repo
....
VERSION = (1, 22)
....

기본설치가 되었다면, repo는 내부적으로 git을 이용하기 때문에 이제 git 설정을 해야한다.

  • Google의 repo 설치 및 Git 기본설정사항
구글 매뉴얼이 볼때마다 업그레이드 되므로, 나중에 이것을 보면 될 것 같다.
  http://source.android.com/source/downloading.html


1.2 Git 기본개념

repo는 위에서 설명했듯이 여러 git를 관리해주는 python script로 기본적으로 정확한 동작을 이해하려면 git의 기본명령을 알아야 하겠다.

GIT의 기본개념 
  https://ahyuo79.blogspot.com/2014/07/git-for-window_20.html

GIT의 기본명령어 
   https://ahyuo79.blogspot.com/2014/07/git.html?zx=2a45dd959990440a

  • Pro-Git 책으로 Git에 관련된 세부사항 
Git에 대해 세부적으로 좀 더 알고 싶다면, 각 사용법을 보자.
  https://git-scm.com/book/en/v2
  https://git-scm.com/docs
  https://git-scm.com/docs/git-fetch


1.3 Gerrit (Git Review) 개념

web-based code를 GIT를 사용하는 system이라고 하며, Google Web Toolkit 이라고 한다. 
GIT의  review 하기위한 tool이라고 하며, Gerrit/Git Review는 GIT의 사용을 집중화시켜준다고 하는데,정확한 용도파악 되지 않았다.

아래의 개념을 보면, remote repository에게 update가 가능한걸로 보여지면, 이것을 어떻게 사용하는지는 정확히 파악을 못하겠다.
GIT의 Remote Repository를  Web base 로 보여주고 이를 관리하는 것으로 보이며, 일단 넘어가자.
Gerrit은 추후 다시 보강 

Github에서 .gitreview 사용법예제 

Git review 사용시 필요한 Package
  http://www.mediawiki.org/wiki/Gerrit/git-review


1.4 Repo 이용한 개발방법 

아래의 기본설명은 repo와 git를 이용한 소스관리방법으로 android에서 소개한 자료이며,
만약 download (git pull) 만 진행을 할 것이면 이부분 까지는 이해 할 필요는 없을 것 같다.



Command Description
repo init Initializes a new client.
repo sync Syncs client to repositories.
repo start Starts a new branch.
repo status Shows status of current branch.
repo upload Uploads changes to the review server.
git add Stages files.
git commit Commits staged files.
git branch Shows current branches.
git branch [branch] Creates new topic branch.
git checkout [branch] Switches HEAD to specified branch
git merge [branch] Merges [branch] into current branch.
git diff Shows diff of unstaged changes.
git diff --cached Shows diff of staged changes.
git log Shows history of current branch.
git log m/[codeline].. Shows commits that are not pushed.

구글메뉴얼 설치 및 개발

구글메뉴얼 repo 사용법
  https://source.android.com/setup/develop/repo


2. Repo의 기본활용 


2.1 Repo 사용방법

Repo프로젝트를 만들기 위해서는 manifest.xml이 필요하다.
하지만, 기존에 있는 존재하던 project의 manifest.xml 있다면, 그 위치로 설정을 하고,
초기화를 진행을 한다.

먼저 사용법을 잘 모를 경우, repo --help or repo init --help 치면 자세한 사용법이
나오며, 각 명령어 마다 --help를 이용하면 된다.

  • repo init     
처음 반드시 실행하여 설정하며, 설정시 .repo 디렉토리 안에 모든 기본구성파일 설정된다.
XML for manifest

repo init -u url [options] 
repo init --help 확인가능

Manifest options Description
-u URL, --manifest-url=URL manifest repository location
-m NAME.xml, --manifest-name=NAME.xml initial manifest file 다른 manifest.xml 지정가능 ( 기본: default.xml)
-b REVISION, --manifest-branch=REVISION manifest branch or revision
  • repo sync
repo init을 한 후 , repo 파일들이 생성된 후 , project 파일들을 받기위해서 각 Server sync 작업을 하는 명령어
처음 실행시에는 git clone과 동일하고,
두번째 실행시에는 아래의 git 명령처럼 remote git repository가 update한 상태를 적용 

$ git remote update
$ git rebase origin/BRANCH

BRANCH 는 현재 checkout 된 local branch 이며 local branch가 remote branch를 tracking 하고 있지 않을 경우 sync 가 이루어지지 않는다.
repo sync 중 git rebase command 에서 conflict 가 발생할 경우 개별적으로 conflict 를 해결하고
git rebase --continue 명령을 실행해야 한다

옵션
-j 작업속도, 동시에 작업을 진행을 한다 (default 4)

  • repo start
소스는 branch와 tag를 만들게 되는데, 이때, 특정 branch 에서 시작할 수 있게 도와준다.

  • repo forall 
소스를 다운받기 위해서 사용한다고 하는데, 정확한 사용용도는 아직파악 못함.
         
repo forall -c git reset --hard 4412_vx.x
     
-c    command도 그 뒤는 argument이다,
       위 실행은 특정 tag를 다운받기 위해서 사용이 되어진다고 한다.

repo download 명령도 있어, 아직 정확한 이해를 못했다.

Android Opensource
  https://android.googlesource.com/platform/
  https://android.googlesource.com/?format=HTML

Repo 사용법
  https://source.android.com/source/using-repo.html
  http://www.dreamy.pe.kr/zbxe/CodeClip/163418

Android Download
  http://source.android.com/source/downloading.html

Android Repo 설정 및 사용법888
  https://source.android.com/setup/build/downloading
  https://source.android.com/setup/develop/index.html


2.2 Repo 사용법 및 구조 

Odroid기반으로 Android 관련소스를 받기 위해서 아래와 같이 설정을 해보며 분석해본다.

// Github 의 GIT 주소 설정한 후 branch 설정하면, 해당 default.xml 로 진행  
$ repo init -u https://github.com/hardkernel/android.git -b 4412_4.4.4_master

//상위에서 설정된 manifest.xml 기반으로 remote 와 project 기반으로 download  
$ repo sync

//일반적으로 repo sync까지 만 사용하며, 이는 별도의 branch 를 생성하기 위해서 실행  
$ repo start 4412_4.4.4_master --all

2.3 repo init 분석  

  • ODROID의 default.xml 과 비교하면서 분석 (repo init 설정) 
아래의 default.xml 분석
<?xml version="1.0" encoding="UTF-8"?>
<manifest>

//구글에서 제공하는 remote AOSP로 다양한 project들이 존재하며, GIT fetch 가능
  <remote  name="aosp"
           fetch="https://android.googlesource.com" />

//Hard Kernel에서 제공하는 remote로 들이 존재하며, Git fetch/push 가능
  <remote  name="origin"
           fetch="https://github.com/codewalkerster"
           push="https://github.com/codewalkerster" />

//CyanogenMod로 Android Community 다양한 Android Project 제공 fetch/review 제공
  <remote  name="github"
           fetch="https://github.com/CyanogenMod"
           review="review.cyanogenmod.org" />

/*
      - 기본 remote를 aosp로 설정 
      - 기본 project들의 revision을  refs/tags/android-4.4.2_r2 설정적용 
      - 아래의 project들은 이 기본 값으로 설정됨
*/
  <default revision="refs/tags/android-4.4.2_r2"
           remote="aosp"
           sync-j="4" />

/*
    상위 remote fetch 내부의  Git project (*.git) 모두 download 함 
    아래의 project name과 동일한 것들을 이제 실제 project path와 함께 적용 (project name은 반드시 unique) 
    revision을 설정으로 추가 tag or branch를 설정가능하며 기본은 상위 default 값에 정의  
    
    1. Google의 경우 Git의 Project Name을 보면 platform/xx/xx  이런식으로 관리를 하므로 쉽게 구분이 가능. 
    2. CyanogenMod 의 경우 Github 이다보니 Google 같은 구성이 되지 않으며,   (e.g android_bionic )
    3. Hardkernel 의 경우 Github 이다보니  동일하게구성  (e.g android_hardware_amlogic_wifi) 
*/

  <project path="build" name="android_build" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" >
    <copyfile src="core/root.mk" dest="Makefile" />
  </project>
  <project path="abi/cpp" name="platform/abi/cpp" groups="pdk" />
  <project path="art" name="platform/art" />
  <project path="bionic" name="android_bionic" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="bootable/bootloader/legacy" name="platform/bootable/bootloader/legacy" />
  <project path="bootable/diskinstaller" name="platform/bootable/diskinstaller" />
  <project path="bootable/recovery" name="platform/bootable/recovery" groups="pdk" />
  <project path="cts" name="platform/cts" groups="cts" />
  <project path="dalvik" name="platform/dalvik" />
  <project path="developers/build" name="platform/developers/build" />
  <project path="developers/demos" name="platform/developers/demos" />
  <project path="developers/docs" name="platform/developers/docs" />
  <project path="developers/samples/android" name="platform/developers/samples/android" />
  <project path="development" name="platform/development" />
  <project path="device/asus/deb" name="device/asus/deb" groups="device,flo" />
  <project path="device/asus/flo" name="device/asus/flo" groups="device,flo" />
  <project path="device/asus/flo-kernel" name="device/asus/flo-kernel" groups="device,flo" />
  <project path="device/asus/grouper" name="device/asus/grouper" groups="device,grouper" />
  <project path="device/asus/tilapia" name="device/asus/tilapia" groups="device,grouper" />
  <project path="device/common" name="device/common" />
  <project path="device/generic/armv7-a-neon" name="device/generic/armv7-a-neon" groups="pdk" />
  <project path="device/generic/common" name="device/generic/common" groups="pdk" />
  <project path="device/generic/goldfish" name="device/generic/goldfish" groups="pdk" />
  <project path="device/generic/mips" name="device/generic/mips" groups="pdk" />
  <project path="device/generic/mini-emulator-armv7-a-neon" name="device/generic/mini-emulator-armv7-a-neon" groups="pdk" />
  <project path="device/generic/mini-emulator-mips" name="device/generic/mini-emulator-mips" groups="pdk" />
  <project path="device/generic/mini-emulator-x86" name="device/generic/mini-emulator-x86" groups="pdk" />
  <project path="device/generic/x86" name="device/generic/x86" groups="pdk" />
  <project path="device/google/accessory/arduino" name="device/google/accessory/arduino" groups="device" />
  <project path="device/google/accessory/demokit" name="device/google/accessory/demokit" groups="device" />
  <project path="device/lge/hammerhead" name="device/lge/hammerhead" groups="device,hammerhead" />
  <project path="device/lge/hammerhead-kernel" name="device/lge/hammerhead-kernel" groups="device,hammerhead" />
  <project path="device/lge/mako" name="device/lge/mako" groups="device,mako" />
  <project path="device/lge/mako-kernel" name="device/lge/mako-kernel" groups="device,mako" />
  <project path="device/sample" name="device/sample" groups="pdk" />
  <project path="device/samsung/manta" name="device/samsung/manta" groups="device,manta" />
  <project path="device/hardkernel/odroidu" name="android_device_hardkernel_odroidu" remote="origin" revision="refs/heads/odroid_4412_master" groups="device" />
  <project path="device/hardkernel/odroidx" name="android_device_hardkernel_odroidx" remote="origin" revision="refs/heads/odroid_4412_master" groups="device" />
  <project path="device/hardkernel/odroidx2" name="android_device_hardkernel_odroidx2" remote="origin" revision="refs/heads/odroid_4412_master" groups="device" />
  <project path="device/hardkernel/proprietary" name="android_device_hardkernel_proprietary" remote="origin" revision="refs/heads/odroid_4412_master" groups="device" >
    <copyfile src="build_android.sh" dest="build_android.sh" />
  </project>
  <project path="docs/source.android.com" name="platform/docs/source.android.com" />
  <project path="external/aac" name="platform/external/aac" groups="pdk" />
  <project path="external/android-clat" name="platform/external/android-clat" />
  <project path="external/android-mock" name="platform/external/android-mock" />
  <project path="external/ant-glob" name="platform/external/ant-glob" />
  <project path="external/antlr" name="platform/external/antlr" />
  <project path="external/apache-harmony" name="platform/external/apache-harmony" />
  <project path="external/apache-http" name="platform/external/apache-http" />
  <project path="external/apache-qp" name="platform/external/apache-qp" />
  <project path="external/apache-xml" name="platform/external/apache-xml" />
  <project path="external/arduino" name="platform/external/arduino" />
  <project path="external/bison" name="platform/external/bison" groups="pdk" />
  <project path="external/blktrace" name="platform/external/blktrace" />
  <project path="external/bluetooth/bluedroid" name="platform/external/bluetooth/bluedroid" groups="pdk" />
  <project path="external/bouncycastle" name="platform/external/bouncycastle" />
  <project path="external/bsdiff" name="platform/external/bsdiff" groups="pdk" />
  <project path="external/bzip2" name="platform/external/bzip2" groups="pdk" />
  <project path="external/busybox" name="android_external_busybox" remote="github" revision="refs/heads/stable/cm-11.0" />
  <project path="external/ceres-solver" name="platform/external/ceres-solver" />
  <project path="external/checkpolicy" name="platform/external/checkpolicy" groups="pdk" />
  <project path="external/chromium" name="platform/external/chromium" />
  <project path="external/chromium-libpac" name="platform/external/chromium-libpac" />
  <project path="external/chromium-trace" name="platform/external/chromium-trace" groups="pdk" />
  <project path="external/chromium_org" name="platform/external/chromium_org" />
  <project path="external/chromium_org/sdch/open-vcdiff" name="platform/external/chromium_org/sdch/open-vcdiff" />
  <project path="external/chromium_org/testing/gtest" name="platform/external/chromium_org/testing/gtest" />
  <project path="external/chromium_org/third_party/WebKit" name="platform/external/chromium_org/third_party/WebKit" />
  <project path="external/chromium_org/third_party/angle_dx11" name="platform/external/chromium_org/third_party/angle_dx11" />
  <project path="external/chromium_org/third_party/eyesfree/src/android/java/src/com/googlecode/eyesfree/braille" name="platform/external/chromium_org/third_party/eyesfree/src/android/java/src/com/googlecode/eyesfree/braille" />
  <project path="external/chromium_org/third_party/freetype" name="platform/external/chromium_org/third_party/freetype" />
  <project path="external/chromium_org/third_party/icu" name="platform/external/chromium_org/third_party/icu" />
  <project path="external/chromium_org/third_party/leveldatabase/src" name="platform/external/chromium_org/third_party/leveldatabase/src" />
  <project path="external/chromium_org/third_party/libjingle/source/talk" name="platform/external/chromium_org/third_party/libjingle/source/talk" />
  <project path="external/chromium_org/third_party/libphonenumber/src/phonenumbers" name="platform/external/chromium_org/third_party/libphonenumber/src/phonenumbers" />
  <project path="external/chromium_org/third_party/libphonenumber/src/resources" name="platform/external/chromium_org/third_party/libphonenumber/src/resources" />
  <project path="external/chromium_org/third_party/mesa/src" name="platform/external/chromium_org/third_party/mesa/src" />
  <project path="external/chromium_org/third_party/openssl" name="platform/external/chromium_org/third_party/openssl" />
  <project path="external/chromium_org/third_party/opus/src" name="platform/external/chromium_org/third_party/opus/src" />
  <project path="external/chromium_org/third_party/ots" name="platform/external/chromium_org/third_party/ots" />
  <project path="external/chromium_org/third_party/skia/gyp" name="platform/external/chromium_org/third_party/skia/gyp" />
  <project path="external/chromium_org/third_party/skia/include" name="platform/external/chromium_org/third_party/skia/include" />
  <project path="external/chromium_org/third_party/skia/src" name="platform/external/chromium_org/third_party/skia/src" />
  <project path="external/chromium_org/third_party/smhasher/src" name="platform/external/chromium_org/third_party/smhasher/src" />
  <project path="external/chromium_org/third_party/yasm/source/patched-yasm" name="platform/external/chromium_org/third_party/yasm/source/patched-yasm" />
  <project path="external/chromium_org/tools/grit" name="platform/external/chromium_org/tools/grit" />
  <project path="external/chromium_org/tools/gyp" name="platform/external/chromium_org/tools/gyp" />
  <project path="external/chromium_org/v8" name="platform/external/chromium_org/v8" />
  <project path="external/clang" name="platform/external/clang" groups="pdk" />
  <project path="external/compiler-rt" name="platform/external/compiler-rt" groups="pdk" />
  <project path="external/dexmaker" name="platform/external/dexmaker" />
  <project path="external/dhcpcd" name="platform/external/dhcpcd" />
  <project path="external/dnsmasq" name="platform/external/dnsmasq" groups="pdk" />
  <project path="external/doclava" name="platform/external/doclava" />
  <project path="external/dropbear" name="platform/external/dropbear" />
  <project path="external/droiddriver" name="platform/external/droiddriver" />
  <project path="external/e2fsprogs" name="android_external_e2fsprogs" groups="pdk" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/easymock" name="platform/external/easymock" />
  <project path="external/eclipse-basebuilder" name="platform/external/eclipse-basebuilder" />
  <project path="external/eclipse-windowbuilder" name="platform/external/eclipse-windowbuilder" />
  <project path="external/eigen" name="platform/external/eigen" />
  <project path="external/elfutils" name="platform/external/elfutils" />
  <project path="external/embunit" name="platform/external/embunit" />
  <project path="external/emma" name="platform/external/emma" />
  <project path="external/esd" name="platform/external/esd" />
  <project path="external/exfat" name="android_external_exfat" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/expat" name="platform/external/expat" groups="pdk" />
  <project path="external/eyes-free" name="platform/external/eyes-free" />
  <project path="external/fdlibm" name="platform/external/fdlibm" />
  <project path="external/flac" name="platform/external/flac" groups="pdk" />
  <project path="external/freetype" name="platform/external/freetype" groups="pdk" />
  <project path="external/fsck_msdos" name="android_external_fsck_msdos" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/fuse" name="android_external_fuse" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/ganymed-ssh2" name="platform/external/ganymed-ssh2" />
  <project path="external/gcc-demangle" name="platform/external/gcc-demangle" groups="pdk" />
  <project path="external/genext2fs" name="platform/external/genext2fs" />
  <project path="external/giflib" name="platform/external/giflib" />
  <project path="external/google-diff-match-patch" name="platform/external/google-diff-match-patch" />
  <project path="external/grub" name="platform/external/grub" />
  <project path="external/gtest" name="platform/external/gtest" groups="pdk" />
  <project path="external/guava" name="platform/external/guava" />
  <project path="external/hamcrest" name="platform/external/hamcrest" />
  <project path="external/harfbuzz" name="platform/external/harfbuzz" />
  <project path="external/harfbuzz_ng" name="platform/external/harfbuzz_ng" />
  <project path="external/hyphenation" name="platform/external/hyphenation" />
  <project path="external/icu4c" name="platform/external/icu4c" groups="pdk" />
  <project path="external/iproute2" name="platform/external/iproute2" groups="pdk" />
  <project path="external/ipsec-tools" name="platform/external/ipsec-tools" />
  <project path="external/iptables" name="platform/external/iptables" />
  <project path="external/iputils" name="platform/external/iputils" />
  <project path="external/jack" name="platform/external/jack" />
  <project path="external/javasqlite" name="platform/external/javasqlite" />
  <project path="external/javassist" name="platform/external/javassist" />
  <project path="external/jdiff" name="platform/external/jdiff" />
  <project path="external/jhead" name="platform/external/jhead" groups="pdk" />
  <project path="external/jmdns" name="platform/external/jmdns" />
  <project path="external/jmonkeyengine" name="platform/external/jmonkeyengine" />
  <project path="external/jpeg" name="platform/external/jpeg" groups="pdk" />
  <project path="external/jsilver" name="platform/external/jsilver" />
  <project path="external/jsr305" name="platform/external/jsr305" />
  <project path="external/junit" name="platform/external/junit" />
  <project path="external/kernel-headers" name="platform/external/kernel-headers" />
  <project path="external/koush/Superuser" name="Superuser" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="external/koush/Widgets" name="Widgets" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/libcap-ng" name="platform/external/libcap-ng" />
  <project path="external/libffi" name="platform/external/libffi" />
  <project path="external/libgsm" name="platform/external/libgsm" groups="pdk" />
  <project path="external/liblzf" name="platform/external/liblzf" groups="pdk" />
  <project path="external/libmtp" name="platform/external/libmtp" />
  <project path="external/libncurses" name="android_external_libncurses" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/libnfc-nci" name="platform/external/libnfc-nci" groups="pdk" />
  <project path="external/libnfc-nxp" name="platform/external/libnfc-nxp" groups="pdk" />
  <project path="external/libnl-headers" name="platform/external/libnl-headers" groups="pdk" />
  <project path="external/libogg" name="platform/external/libogg" />
  <project path="external/libpcap" name="platform/external/libpcap" />
  <project path="external/libphonenumber" name="platform/external/libphonenumber" />
  <project path="external/libpng" name="platform/external/libpng" groups="pdk" />
  <project path="external/libppp" name="platform/external/libppp" />
  <project path="external/libselinux" name="platform/external/libselinux" groups="pdk" />
  <project path="external/libsepol" name="platform/external/libsepol" groups="pdk" />
  <project path="external/libusb" name="platform/external/libusb" />
  <project path="external/libusb-compat" name="platform/external/libusb-compat" />
  <project path="external/libvorbis" name="platform/external/libvorbis" />
  <project path="external/libvpx" name="platform/external/libvpx" groups="pdk" />
  <project path="external/libxml2" name="platform/external/libxml2" />
  <project path="external/libxslt" name="platform/external/libxslt" />
  <project path="external/libyuv" name="platform/external/libyuv" groups="libyuv" />
  <project path="external/linux-tools-perf" name="platform/external/linux-tools-perf" />
  <project path="external/littlemock" name="platform/external/littlemock" />
  <project path="external/llvm" name="platform/external/llvm" groups="pdk" />
  <project path="external/lzma" name="platform/external/lzma" />
  <project path="external/marisa-trie" name="platform/external/marisa-trie" />
  <project path="external/markdown" name="platform/external/markdown" />
  <project path="external/mdnsresponder" name="platform/external/mdnsresponder" groups="pdk" />
  <project path="external/mesa3d" name="platform/external/mesa3d" />
  <project path="external/mksh" name="platform/external/mksh" groups="pdk" />
  <project path="external/mockito" name="platform/external/mockito" />
  <project path="external/mockwebserver" name="platform/external/mockwebserver" />
  <project path="external/mp4parser" name="platform/external/mp4parser" />
  <project path="external/mtpd" name="platform/external/mtpd" />
  <project path="external/naver-fonts" name="platform/external/naver-fonts" />
  <project path="external/netcat" name="platform/external/netcat" />
  <project path="external/netperf" name="platform/external/netperf" />
  <project path="external/neven" name="platform/external/neven" />
  <project path="external/nist-pkits" name="platform/external/nist-pkits" />
  <project path="external/nist-sip" name="platform/external/nist-sip" />
  <project path="external/noto-fonts" name="platform/external/noto-fonts" />
  <project path="external/ntfs-3g" name="android_external_ntfs-3g" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/oauth" name="platform/external/oauth" />
  <project path="external/objenesis" name="platform/external/objenesis" />
  <project path="external/okhttp" name="platform/external/okhttp" />
  <project path="external/open-vcdiff" name="platform/external/open-vcdiff" />
  <project path="external/opencv" name="platform/external/opencv" />
  <project path="external/openfst" name="platform/external/openfst" />
  <project path="external/openssh" name="platform/external/openssh" />
  <project path="external/openssl" name="platform/external/openssl" groups="pdk" />
  <project path="external/oprofile" name="platform/external/oprofile" />
  <project path="external/pixman" name="platform/external/pixman" />
  <project path="external/ppp" name="platform/external/ppp" />
  <project path="external/proguard" name="platform/external/proguard" groups="pdk-java" />
  <project path="external/protobuf" name="platform/external/protobuf" groups="pdk" />
  <project path="external/qemu" name="platform/external/qemu" />
  <project path="external/qemu-pc-bios" name="platform/external/qemu-pc-bios" />
  <project path="external/regex-re2" name="platform/external/regex-re2" />
  <project path="external/replicaisland" name="platform/external/replicaisland" />
  <project path="external/robolectric" name="platform/external/robolectric" />
  <project path="external/safe-iop" name="platform/external/safe-iop" groups="pdk" />
  <project path="external/scrypt" name="platform/external/scrypt" groups="pdk" />
  <project path="external/sepolicy" name="platform/external/sepolicy" groups="pdk" />
  <project path="external/sfntly" name="platform/external/sfntly" />
  <project path="external/sil-fonts" name="platform/external/sil-fonts" />
  <project path="external/skia" name="platform/external/skia" />
  <project path="external/smack" name="platform/external/smack" />
  <project path="external/smali" name="platform/external/smali" />
  <project path="external/sonivox" name="platform/external/sonivox" groups="pdk" />
  <project path="external/speex" name="platform/external/speex" groups="pdk" />
  <project path="external/sqlite" name="platform/external/sqlite" groups="pdk" />
  <project path="external/srec" name="platform/external/srec" />
  <project path="external/srtp" name="platform/external/srtp" />
  <project path="external/stlport" name="platform/external/stlport" groups="pdk" />
  <project path="external/strace" name="platform/external/strace" />
  <project path="external/stressapptest" name="platform/external/stressapptest" />
  <project path="external/svox" name="platform/external/svox" />
  <project path="external/tagsoup" name="platform/external/tagsoup" />
  <project path="external/tcpdump" name="platform/external/tcpdump" />
  <project path="external/timezonepicker-support" name="platform/external/timezonepicker-support" />
  <project path="external/tinyalsa" name="platform/external/tinyalsa" groups="pdk" />
  <project path="external/tinycompress" name="platform/external/tinycompress" groups="pdk" />
  <project path="external/tinyxml" name="platform/external/tinyxml" groups="pdk" />
  <project path="external/tinyxml2" name="platform/external/tinyxml2" groups="pdk" />
  <project path="external/tremolo" name="platform/external/tremolo" groups="pdk" />
  <project path="external/v8" name="platform/external/v8" />
  <project path="external/valgrind" name="platform/external/valgrind" groups="pdk" />
  <project path="external/vim" name="android_external_vim" remote="github" revision="refs/heads/cm-11.0" />
  <project path="external/webp" name="platform/external/webp" />
  <project path="external/webrtc" name="platform/external/webrtc" groups="pdk" />
  <project path="external/wpa_supplicant_8" name="android_external_wpa_supplicant_8" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="external/xmlwriter" name="platform/external/xmlwriter" />
  <project path="external/xmp_toolkit" name="platform/external/xmp_toolkit" />
  <project path="external/yaffs2" name="platform/external/yaffs2" groups="pdk" />
  <project path="external/zlib" name="platform/external/zlib" groups="pdk" />
  <project path="external/zxing" name="platform/external/zxing" />
  <project path="frameworks/av" name="android_frameworks_av" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="frameworks/base" name="android_frameworks_base" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="frameworks/compile/libbcc" name="platform/frameworks/compile/libbcc" groups="pdk" />
  <project path="frameworks/compile/mclinker" name="platform/frameworks/compile/mclinker" groups="pdk" />
  <project path="frameworks/compile/slang" name="platform/frameworks/compile/slang" groups="pdk" />
  <project path="frameworks/ex" name="platform/frameworks/ex" />
  <project path="frameworks/mff" name="platform/frameworks/mff" />
  <project path="frameworks/ml" name="platform/frameworks/ml" />
  <project path="frameworks/native" name="android_frameworks_native" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="frameworks/opt/calendar" name="platform/frameworks/opt/calendar" />
  <project path="frameworks/opt/carddav" name="platform/frameworks/opt/carddav" />
  <project path="frameworks/opt/colorpicker" name="platform/frameworks/opt/colorpicker" />
  <project path="frameworks/opt/datetimepicker" name="platform/frameworks/opt/datetimepicker" />
  <project path="frameworks/opt/emoji" name="platform/frameworks/opt/emoji" />
  <project path="frameworks/opt/inputmethodcommon" name="platform/frameworks/opt/inputmethodcommon" />
  <project path="frameworks/opt/mailcommon" name="platform/frameworks/opt/mailcommon" />
  <project path="frameworks/opt/mms" name="platform/frameworks/opt/mms" />
  <project path="frameworks/opt/net/voip" name="platform/frameworks/opt/net/voip" />
  <project path="frameworks/opt/photoviewer" name="platform/frameworks/opt/photoviewer" />
  <project path="frameworks/opt/timezonepicker" name="platform/frameworks/opt/timezonepicker" />
  <project path="frameworks/opt/telephony" name="platform/frameworks/opt/telephony" groups="pdk" />
  <project path="frameworks/opt/vcard" name="platform/frameworks/opt/vcard" />
  <project path="frameworks/rs" name="platform/frameworks/rs" groups="pdk" />
  <project path="frameworks/support" name="platform/frameworks/support" />
  <project path="frameworks/testing" name="platform/frameworks/testing" />
  <project path="frameworks/uiautomator" name="platform/frameworks/uiautomator" />
  <project path="frameworks/volley" name="platform/frameworks/volley" />
  <project path="frameworks/webview" name="platform/frameworks/webview" />
  <project path="frameworks/wilhelm" name="platform/frameworks/wilhelm" />
  <project path="hardware/akm" name="platform/hardware/akm" />
  <project path="hardware/broadcom/libbt" name="platform/hardware/broadcom/libbt" groups="pdk" />
  <project path="hardware/broadcom/wlan" name="platform/hardware/broadcom/wlan" groups="broadcom_wlan" />
  <project path="hardware/hardkernel" name="android_hardware_hardkernel" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="hardware/invensense" name="platform/hardware/invensense" groups="invensense" />
  <project path="hardware/libhardware" name="android_hardware_libhardware" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="hardware/libhardware_legacy" name="android_hardware_libhardware_legacy" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="hardware/qcom/audio" name="platform/hardware/qcom/audio" groups="qcom" />
  <project path="hardware/qcom/bt" name="platform/hardware/qcom/bt" groups="qcom" />
  <project path="hardware/qcom/camera" name="platform/hardware/qcom/camera" groups="qcom" />
  <project path="hardware/qcom/display" name="platform/hardware/qcom/display" groups="qcom" />
  <project path="hardware/qcom/keymaster" name="platform/hardware/qcom/keymaster" groups="qcom" />
  <project path="hardware/qcom/media" name="platform/hardware/qcom/media" groups="qcom" />
  <project path="hardware/qcom/msm8960" name="platform/hardware/qcom/msm8960" groups="qcom_msm8960" />
  <project path="hardware/qcom/msm8x74" name="platform/hardware/qcom/msm8x74" groups="qcom_msm8x74" />
  <project path="hardware/qcom/power" name="platform/hardware/qcom/power" groups="qcom" />
  <project path="hardware/qcom/sensors" name="platform/hardware/qcom/sensors" groups="qcom" />
  <project path="hardware/qcom/wlan" name="platform/hardware/qcom/wlan" groups="qcom_wlan" />
  <project path="hardware/realtek" name="android_hardware_realtek" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="hardware/ril" name="platform/hardware/ril" groups="pdk" />
  <project path="hardware/samsung_slsi/exynos4" name="android_hardware_samsung_slsi_exynos4" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="hardware/samsung_slsi/exynos5" name="platform/hardware/samsung_slsi/exynos5" groups="exynos5" />
  <project path="hardware/ti/omap3" name="platform/hardware/ti/omap3" />
  <project path="hardware/ti/omap4xxx" name="platform/hardware/ti/omap4xxx" groups="omap4" />
  <project path="hardware/ti/wlan" name="platform/hardware/ti/wlan" />
  <project path="hardware/ti/wpan" name="platform/hardware/ti/wpan" />
  <project path="libcore" name="platform/libcore" />
  <project path="libnativehelper" name="platform/libnativehelper" groups="pdk-java" />
  <project path="ndk" name="platform/ndk" />
  <project path="packages/apps/BasicSmsReceiver" name="platform/packages/apps/BasicSmsReceiver" />
  <project path="packages/apps/Bluetooth" name="platform/packages/apps/Bluetooth" />
  <project path="packages/apps/Browser" name="platform/packages/apps/Browser" />
  <project path="packages/apps/Calculator" name="platform/packages/apps/Calculator" />
  <project path="packages/apps/Calendar" name="platform/packages/apps/Calendar" />
  <project path="packages/apps/Camera" name="platform/packages/apps/Camera" />
  <project path="packages/apps/Camera2" name="platform/packages/apps/Camera2" />
  <project path="packages/apps/CellBroadcastReceiver" name="platform/packages/apps/CellBroadcastReceiver" />
  <project path="packages/apps/CertInstaller" name="platform/packages/apps/CertInstaller" />
  <project path="packages/apps/Contacts" name="platform/packages/apps/Contacts" />
  <project path="packages/apps/ContactsCommon" name="platform/packages/apps/ContactsCommon" />
  <project path="packages/apps/DeskClock" name="platform/packages/apps/DeskClock" />
  <project path="packages/apps/Dialer" name="platform/packages/apps/Dialer" />
  <project path="packages/apps/Email" name="platform/packages/apps/Email" />
  <project path="packages/apps/Exchange" name="platform/packages/apps/Exchange" />
  <project path="packages/apps/Gallery" name="platform/packages/apps/Gallery" />
  <project path="packages/apps/Gallery2" name="platform/packages/apps/Gallery2" />
  <project path="packages/apps/HTMLViewer" name="platform/packages/apps/HTMLViewer" />
  <project path="packages/apps/InCallUI" name="platform/packages/apps/InCallUI" />
  <project path="packages/apps/KeyChain" name="platform/packages/apps/KeyChain" />
  <project path="packages/apps/Launcher2" name="platform/packages/apps/Launcher2" />
  <project path="packages/apps/Launcher3" name="platform/packages/apps/Launcher3" />
  <project path="packages/apps/LegacyCamera" name="platform/packages/apps/LegacyCamera" />
  <project path="packages/apps/Mms" name="platform/packages/apps/Mms" />
  <project path="packages/apps/Music" name="platform/packages/apps/Music" />
  <project path="packages/apps/MusicFX" name="platform/packages/apps/MusicFX" />
  <project path="packages/apps/Nfc" name="platform/packages/apps/Nfc" />
  <project path="packages/apps/OdroidUpdater" name="android_packages_apps_OdroidUpdater" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="packages/apps/OneTimeInitializer" name="platform/packages/apps/OneTimeInitializer" />
  <project path="packages/apps/PackageInstaller" name="platform/packages/apps/PackageInstaller" />
  <project path="packages/apps/Phone" name="platform/packages/apps/Phone" />
  <project path="packages/apps/PhoneCommon" name="platform/packages/apps/PhoneCommon" />
  <project path="packages/apps/Protips" name="platform/packages/apps/Protips" />
  <project path="packages/apps/Provision" name="platform/packages/apps/Provision" />
  <project path="packages/apps/QuickSearchBox" name="platform/packages/apps/QuickSearchBox" />
  <project path="packages/apps/Settings" name="android_packages_apps_Settings" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="packages/apps/SmartCardService" name="platform/packages/apps/SmartCardService" />
  <project path="packages/apps/SoundRecorder" name="android_packages_apps_SoundRecorder" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="packages/apps/SpareParts" name="platform/packages/apps/SpareParts" />
  <project path="packages/apps/SpeechRecorder" name="platform/packages/apps/SpeechRecorder" />
  <project path="packages/apps/Stk" name="platform/packages/apps/Stk" />
  <project path="packages/apps/Tag" name="platform/packages/apps/Tag" />
  <project path="packages/apps/UnifiedEmail" name="platform/packages/apps/UnifiedEmail" />
  <project path="packages/apps/Utility" name="android_packages_apps_Utility" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="packages/apps/VideoEditor" name="platform/packages/apps/VideoEditor" />
  <project path="packages/apps/VoiceDialer" name="platform/packages/apps/VoiceDialer" />
  <project path="packages/experimental" name="platform/packages/experimental" />
  <project path="packages/inputmethods/LatinIME" name="platform/packages/inputmethods/LatinIME" />
  <project path="packages/inputmethods/OpenWnn" name="platform/packages/inputmethods/OpenWnn" />
  <project path="packages/inputmethods/PinyinIME" name="platform/packages/inputmethods/PinyinIME" />
  <project path="packages/providers/ApplicationsProvider" name="platform/packages/providers/ApplicationsProvider" />
  <project path="packages/providers/CalendarProvider" name="platform/packages/providers/CalendarProvider" />
  <project path="packages/providers/ContactsProvider" name="platform/packages/providers/ContactsProvider" />
  <project path="packages/providers/DownloadProvider" name="platform/packages/providers/DownloadProvider" />
  <project path="packages/providers/MediaProvider" name="platform/packages/providers/MediaProvider" />
  <project path="packages/providers/PartnerBookmarksProvider" name="platform/packages/providers/PartnerBookmarksProvider" />
  <project path="packages/providers/TelephonyProvider" name="platform/packages/providers/TelephonyProvider" />
  <project path="packages/providers/UserDictionaryProvider" name="platform/packages/providers/UserDictionaryProvider" />
  <project path="packages/screensavers/Basic" name="platform/packages/screensavers/Basic" />
  <project path="packages/screensavers/PhotoTable" name="platform/packages/screensavers/PhotoTable" />
  <project path="packages/screensavers/WebView" name="platform/packages/screensavers/WebView" />
  <project path="packages/services/Telephony" name="platform/packages/services/Telephony" />
  <project path="packages/wallpapers/Basic" name="platform/packages/wallpapers/Basic" />
  <project path="packages/wallpapers/Galaxy4" name="platform/packages/wallpapers/Galaxy4" />
  <project path="packages/wallpapers/HoloSpiral" name="platform/packages/wallpapers/HoloSpiral" />
  <project path="packages/wallpapers/LivePicker" name="platform/packages/wallpapers/LivePicker" />
  <project path="packages/wallpapers/MagicSmoke" name="platform/packages/wallpapers/MagicSmoke" />
  <project path="packages/wallpapers/MusicVisualization" name="platform/packages/wallpapers/MusicVisualization" />
  <project path="packages/wallpapers/NoiseField" name="platform/packages/wallpapers/NoiseField" />
  <project path="packages/wallpapers/PhaseBeam" name="platform/packages/wallpapers/PhaseBeam" />
  <project path="pdk" name="platform/pdk" groups="pdk" />
  <project path="prebuilts/clang/darwin-x86/3.1" name="platform/prebuilts/clang/darwin-x86/3.1" groups="pdk,darwin" />
  <project path="prebuilts/clang/darwin-x86/3.2" name="platform/prebuilts/clang/darwin-x86/3.2" groups="pdk,darwin" />
  <project path="prebuilts/clang/darwin-x86/arm/3.3" name="platform/prebuilts/clang/darwin-x86/arm/3.3" groups="darwin,arm" />
  <project path="prebuilts/clang/darwin-x86/host/3.3" name="platform/prebuilts/clang/darwin-x86/host/3.3" groups="darwin" />
  <project path="prebuilts/clang/darwin-x86/mips/3.3" name="platform/prebuilts/clang/darwin-x86/mips/3.3" groups="darwin,mips" />
  <project path="prebuilts/clang/darwin-x86/x86/3.3" name="platform/prebuilts/clang/darwin-x86/x86/3.3" groups="darwin,x86" />
  <project path="prebuilts/clang/linux-x86/3.1" name="platform/prebuilts/clang/linux-x86/3.1" groups="pdk,linux" />
  <project path="prebuilts/clang/linux-x86/3.2" name="platform/prebuilts/clang/linux-x86/3.2" groups="pdk,linux" />
  <project path="prebuilts/clang/linux-x86/arm/3.3" name="platform/prebuilts/clang/linux-x86/arm/3.3" groups="linux,arm" />
  <project path="prebuilts/clang/linux-x86/host/3.3" name="platform/prebuilts/clang/linux-x86/host/3.3" groups="linux" />
  <project path="prebuilts/clang/linux-x86/mips/3.3" name="platform/prebuilts/clang/linux-x86/mips/3.3" groups="linux,mips" />
  <project path="prebuilts/clang/linux-x86/x86/3.3" name="platform/prebuilts/clang/linux-x86/x86/3.3" groups="linux,x86" />
  <project path="prebuilts/devtools" name="platform/prebuilts/devtools" />
  <project path="prebuilts/eclipse" name="platform/prebuilts/eclipse" groups="pdk" />
  <project path="prebuilts/eclipse-build-deps" name="platform/prebuilts/eclipse-build-deps" groups="notdefault,eclipse" />
  <project path="prebuilts/eclipse-build-deps-sources" name="platform/prebuilts/eclipse-build-deps-sources" groups="notdefault,eclipse" />
  <project path="prebuilts/gcc/darwin-x86/arm/arm-eabi-4.6" name="platform/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.6" groups="pdk,darwin,arm" />
  <project path="prebuilts/gcc/darwin-x86/arm/arm-eabi-4.7" name="platform/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.7" groups="pdk,darwin,arm" />
  <project path="prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.6" name="platform/prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.6" groups="pdk,darwin,arm" />
  <project path="prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.7" name="platform/prebuilts/gcc/darwin-x86/arm/arm-linux-androideabi-4.7" groups="pdk,darwin,arm" />
  <project path="prebuilts/gcc/darwin-x86/host/headers" name="platform/prebuilts/gcc/darwin-x86/host/headers" groups="pdk,darwin" />
  <project path="prebuilts/gcc/darwin-x86/host/i686-apple-darwin-4.2.1" name="platform/prebuilts/gcc/darwin-x86/host/i686-apple-darwin-4.2.1" groups="pdk,darwin" />
  <project path="prebuilts/gcc/darwin-x86/mips/mipsel-linux-android-4.6" name="platform/prebuilts/gcc/darwin-x86/mips/mipsel-linux-android-4.6" groups="pdk,darwin,mips" />
  <project path="prebuilts/gcc/darwin-x86/mips/mipsel-linux-android-4.7" name="platform/prebuilts/gcc/darwin-x86/mips/mipsel-linux-android-4.7" groups="pdk,darwin,mips" />
  <project path="prebuilts/gcc/darwin-x86/x86/i686-linux-android-4.6" name="platform/prebuilts/gcc/darwin-x86/x86/i686-linux-android-4.6" groups="pdk,darwin,x86" />
  <project path="prebuilts/gcc/darwin-x86/x86/i686-linux-android-4.7" name="platform/prebuilts/gcc/darwin-x86/x86/i686-linux-android-4.7" groups="pdk,darwin,x86" />
  <project path="prebuilts/gcc/darwin-x86/x86/x86_64-linux-android-4.7" name="platform/prebuilts/gcc/darwin-x86/x86/x86_64-linux-android-4.7" groups="pdk,darwin,x86" />
  <project path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.6" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6" groups="pdk,linux,arm" />
  <project path="prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" name="platform/prebuilts/gcc/linux-x86/arm/arm-eabi-4.7" groups="pdk,linux,arm" />
  <project path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6" groups="pdk,linux,arm" />
  <project path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7" groups="pdk,linux,arm" />
  <project path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.4.3" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.4.3" groups="pdk,linux" />
  <project path="prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" name="platform/prebuilts/gcc/linux-x86/host/i686-linux-glibc2.7-4.6" groups="pdk,linux" />
  <project path="prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" name="platform/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.7-4.6" groups="pdk,linux" />
  <project path="prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.6" name="platform/prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.6" groups="pdk,linux,mips" />
  <project path="prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.7" name="platform/prebuilts/gcc/linux-x86/mips/mipsel-linux-android-4.7" groups="pdk,linux,mips" />
  <project path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.6" groups="pdk,linux,x86" />
  <project path="prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" name="platform/prebuilts/gcc/linux-x86/x86/i686-linux-android-4.7" groups="pdk,linux,x86" />
  <project path="prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.7" name="platform/prebuilts/gcc/linux-x86/x86/x86_64-linux-android-4.7" groups="pdk,linux,x86" />
  <project path="prebuilts/misc" name="platform/prebuilts/misc" groups="pdk" />
  <project path="prebuilts/ndk" name="platform/prebuilts/ndk" groups="pdk" />
  <project path="prebuilts/python/darwin-x86/2.7.5" name="platform/prebuilts/python/darwin-x86/2.7.5" groups="darwin" />
  <project path="prebuilts/python/linux-x86/2.7.5" name="platform/prebuilts/python/linux-x86/2.7.5" groups="linux" />
  <project path="prebuilts/qemu-kernel" name="platform/prebuilts/qemu-kernel" groups="pdk" />
  <project path="prebuilts/runtime" name="platform/prebuilts/runtime" />
  <project path="prebuilts/sdk" name="platform/prebuilts/sdk" groups="pdk" />
  <project path="prebuilts/tools" name="platform/prebuilts/tools" groups="pdk,tools" />
  <project path="sdk" name="platform/sdk" />
  <project path="system/core" name="android_system_core" remote= "origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="system/extras" name="android_system_extras" remote="origin" revision="refs/heads/odroid_4412_master" groups="pdk" />
  <project path="system/media" name="platform/system/media" groups="pdk" />
  <project path="system/netd" name="platform/system/netd" groups="pdk" />
  <project path="system/security" name="platform/system/security" groups="pdk" />
  <project path="system/vold" name="android_system_vold" groups="pdk" remote="origin" revision="refs/heads/odroid_4412_master" />
  <project path="tools/adt/eclipse" name="platform/tools/adt/eclipse" groups="notdefault,tools" />
  <project path="tools/adt/idea" name="platform/tools/adt/idea" groups="notdefault,tools" />
  <project path="tools/base" name="platform/tools/base" groups="notdefault,tools" />
  <project path="tools/build" name="platform/tools/build" groups="notdefault,tools" />
  <project path="tools/emulator" name="platform/tools/emulator" groups="notdefault,tools" />
  <project path="tools/external/fat32lib" name="platform/tools/external/fat32lib" groups="tools" />
  <project path="tools/external/gradle" name="platform/tools/external/gradle" groups="tools" />
  <project path="tools/idea" name="platform/tools/idea" groups="notdefault,tools" />
  <project path="tools/motodev" name="platform/tools/motodev" groups="notdefault,motodev" />
  <project path="tools/studio/cloud" name="platform/tools/studio/cloud" groups="notdefault,tools" />
  <project path="tools/swt" name="platform/tools/swt" groups="notdefault,tools" />
  <project path="vendor/ralink" name="android_vendor_ralink" remote="origin" revision="refs/heads/odroid_4412_master" />
</manifest>

관련소스 

  • repo init 설정 및 확인  
repo init -u  했을 경우, .repo 디렉토리 및 manifest.xml 생성된다. 
그리고, 정보 입력을 요구하는데 Name, E-Mail, Path  확인하자,
아래와 같이, branch 및 tag 정보 확인이 가능하다.

Get https://github.com/hardkernel/android.git  // default.xml로 동작 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
curl: (22) The requested URL returned error: 404
Server does not provide clone.bundle; ignoring.
remote: Counting objects: 1097, done.
remote: Compressing objects: 100% (456/456), done.
remote: Total 1097 (delta 446), reused 1097 (delta 446)
Receiving objects: 100% (1097/1097), 434.98 KiB | 181 KiB/s, done.
Resolving deltas: 100% (446/446), done.
From https://github.com/hardkernel/android
 * [new branch]      4412_4.1.2_master -> origin/4412_4.1.2_master
 * [new branch]      4412_4.4.3_master -> origin/4412_4.4.3_master
 * [new branch]      4412_4.4.4_master -> origin/4412_4.4.4_master
 * [new branch]      4412_L_master -> origin/4412_L_master
 * [new branch]      5410_4.2.2_master -> origin/5410_4.2.2_master
 * [new branch]      odroid_4412_master -> origin/odroid_4412_master
 * [new branch]      odroid_5410_master -> origin/odroid_5410_master 
...........

repo init을 한후 .repo를 보면 다음과 같이 구성 

$ tree .repo
.repo
├── manifest.xml -> manifests/default.xml
├── manifests
│   ├── default.xml
│   └── .git  // 아래의 manifests.git link로 구성
├── manifests.git        // 상위 default.xml GIT download 했기 때문에 Git 정보
│   ├── FETCH_HEAD
│   ├── HEAD
│   ├── branches
│   ├── config
│   ├── description
│   ├── hooks
│   │   ├── applypatch-msg.sample
│   │   ├── commit-msg -> ../../repo/hooks/commit-msg
│   │   ├── commit-msg.sample
│   │   ├── post-update.sample
│   │   ├── pre-applypatch.sample
│   │   ├── pre-auto-gc -> ../../repo/hooks/pre-auto-gc
│   │   ├── pre-commit.sample
│   │   ├── pre-rebase.sample
│   │   ├── prepare-commit-msg.sample
│   │   └── update.sample
│   ├── info
│   │   └── exclude
│   ├── logs
│   │   └── refs
│   │       └── remotes
│   │           └── origin
│   │               ├── 4412_4.1.2_master
│   │               ├── 4412_4.4.3_master
│   │               ├── 4412_4.4.4_master
│   │               ├── 4412_L_master
│   │               ├── 5410_4.2.2_master
│   │               ├── 5422_4.2.2_master
│   │               ├── 5422_4.4.2_master
│   │               ├── 5422_4.4.4_master
│   │               ├── odroid_4412_master
│   │               ├── odroid_5410_master
│   │               ├── s805_4.4.2_master
│   │               └── s905_5.1.1_master
│   ├── objects
│   │   ├── info
│   │   └── pack
│   │       ├── pack-156a343f25e111fb8e411eb1d779fe669997e79d.idx
│   │       └── pack-156a343f25e111fb8e411eb1d779fe669997e79d.pack
│   ├── packed-refs
│   ├── refs
│   │   ├── heads
│   │   │   └── default
│   │   ├── remotes
│   │   └── tags
│   ├── rr-cache
│   └── svn
└── repo           // repo 관련된 phython program 
    ├── COPYING
    ├── SUBMITTING_PATCHES
    ├── color.py
    ├── color.pyc
    ├── command.py
    ├── command.pyc
    ├── docs
    │   └── manifest-format.txt  // manifest-format.xml 문법설명 및 사용법 
    ├── editor.py
    ├── editor.pyc
    ├── error.py
    ├── error.pyc
    ├── git_command.py
    ├── git_command.pyc
    ├── git_config.py
    ├── git_config.pyc
    ├── git_refs.py
    ├── git_refs.pyc
    ├── git_ssh
    ├── gitc_utils.py
    ├── gitc_utils.pyc
    ├── hooks
    │   ├── commit-msg
    │   └── pre-auto-gc
    ├── main.py
    ├── manifest_xml.py
    ├── manifest_xml.pyc
    ├── pager.py
    ├── pager.pyc
    ├── progress.py
    ├── progress.pyc
    ├── project.py
    ├── project.pyc
    ├── pyversion.py
    ├── pyversion.pyc
    ├── repo
    ├── repoc
    ├── subcmds
    │   ├── __init__.py
    │   ├── __init__.pyc
    │   ├── abandon.py
    │   ├── abandon.pyc
    │   ├── branches.py
    │   ├── branches.pyc
    │   ├── checkout.py
    │   ├── checkout.pyc
    │   ├── cherry_pick.py
    │   ├── cherry_pick.pyc
    │   ├── diff.py
    │   ├── diff.pyc
    │   ├── diffmanifests.py
    │   ├── diffmanifests.pyc
    │   ├── download.py
    │   ├── download.pyc
    │   ├── forall.py
    │   ├── forall.pyc
    │   ├── gitc_delete.py
    │   ├── gitc_delete.pyc
    │   ├── gitc_init.py
    │   ├── gitc_init.pyc
    │   ├── grep.py
    │   ├── grep.pyc
    │   ├── help.py
    │   ├── help.pyc
    │   ├── info.py
    │   ├── info.pyc
    │   ├── init.py
    │   ├── init.pyc
    │   ├── list.py
    │   ├── list.pyc
    │   ├── manifest.py
    │   ├── manifest.pyc
    │   ├── overview.py
    │   ├── overview.pyc
    │   ├── prune.py
    │   ├── prune.pyc
    │   ├── rebase.py
    │   ├── rebase.pyc
    │   ├── selfupdate.py
    │   ├── selfupdate.pyc
    │   ├── smartsync.py
    │   ├── smartsync.pyc
    │   ├── stage.py
    │   ├── stage.pyc
    │   ├── start.py
    │   ├── start.pyc
    │   ├── status.py
    │   ├── status.pyc
    │   ├── sync.py
    │   ├── sync.pyc
    │   ├── upload.py
    │   ├── upload.pyc
    │   ├── version.py
    │   └── version.pyc
    ├── tests
    │   ├── fixtures
    │   │   ├── gitc_config
    │   │   └── test.gitconfig
    │   ├── test_git_config.py
    │   └── test_wrapper.py
    ├── trace.py
    ├── trace.pyc
    ├── wrapper.py
    └── wrapper.pyc

2.4 repo sync 분석  

  • repo sync 동작 후 구조파악     
project-object 와 project 그리고, project.list 기반으로 분석
  1. project-object : source를 미제공하며 *.so 로 제공 및 module로 제공 
  2. project: 소스형태로 제공  

상위 default.xml의 project에 존재하지 않는 것을 가지고 있는 것으로 보아 remote를 전체를 download 한 것으로 보인다. 
아래 상위 default.xml의 project name에 없는 것들은 주로 CyanogenMod 와 Hardkernel 검색가능

$ tree -t -L 2 --charset unicode .repo/  
.repo/
|-- repo // repo 관련된 phython program 이므로 sub는 삭제 
|
|-- manifests
|   `-- default.xml         
|-- manifest.xml    // -> manifests/default.xml (repo init -u 의 정보)  
|-- manifests.git   // 상위 default.xml 저장된 곳의 GIT 정보 
|   |-- branches
|   |-- description
|   |-- HEAD
|   |-- hooks
|   |-- info
|   |-- objects
|   |-- logs
|   |-- refs
|   |-- config
|   |-- packed-refs
|   |-- rr-cache
|   |-- svn
|   `-- FETCH_HEAD
|-- project-objects     // project의 name 기반으로 GIT 구성 (아래 다시세부분석)  
|   |-- android_hardware_libhardware.git
|   |-- android_hardware_backports.git   //project name 없음, HardKernel 존재 
|   |-- android_system_extras.git
|   |-- android_frameworks_native.git
|   |-- android_device_hardkernel_odroidu.git
|   |-- android_frameworks_av.git
|   |-- android_device_hardkernel_odroidx.git
|   |-- android_external_ntfs-3g.git
|   |-- android_packages_apps_SoundRecorder.git
|   |-- android_device_hardkernel_proprietary.git
|   |-- android_build.git
|   |-- android_hardware_hardkernel.git
|   |-- android_external_ppp.git     //project name 없음, CyanogenMod 존재 
|   |-- android_hardware_ril.git     //project name 없음, CyanogenMod 존재 
|   |-- android_hardware_wifi_realtek_drivers_8192cu.git  //project name 없음, HardKernel 존재 
|   |-- android_system_core.git
|   |-- android_external_wpa_supplicant_8.git
|   |-- android_hardware_libhardware_legacy.git
|   |-- android_external_exfat.git
|   |-- android_external_libusb.git  //project name 없음, CyanogenMod 존재
|   |-- android_device_rockchip.git  //project name 없음, HardKernel 존재
|   |-- android_external_vim.git
|   |-- android_frameworks_base.git
|   |-- android_packages_apps_OdroidUpdater.git
|   |-- android_bionic.git
|   |-- android_external_busybox.git
|   |-- device               // Git directory 
|   |-- Superuser.git
|   |-- android_external_fsck_msdos.git
|   |-- android_external_fuse.git
|   |-- android_hardware_amlogic_wifi.git   //project name 없음, CyanogenMod 존재 
|   |-- android_external_bluetooth_bluedroid.git //project name 없음, HardKernel 존재
|   |-- Widgets.git
|   |-- android_device_hardkernel_odroidx2.git
|   |-- android_hardware_broadcom_libbt.git  //project name 없음, HardKernel 존재
|   |-- android_external_libncurses.git
|   |-- android_packages_apps_Bluetooth.git  //project name 없음, HardKernel 존재
|   |-- android_packages_apps_Settings.git
|   |-- android_vendor_ralink.git
|   |-- android_frameworks_opt_vcard.git   //project name 없음, HardKernel 존재
|   |-- android_packages_apps_Utility.git
|   |-- linux.git                   //project name 없음, HardKernel 존재 
|   |-- android_dalvik.git          //project name 없음, HardKernel 존재 
|   |-- android_hardware_samsung_slsi_exynos4.git
|   |-- android_external_e2fsprogs.git
|   |-- android_system_vold.git
|   `-- platform                    // Git directory 
|-- projects   // project의 source 형태 
|   |-- tools
|   |-- docs
|   |-- device
|   |-- abi
|   |-- packages
|   |-- bootable
|   |-- vendor
|   |-- hardware
|   |-- developers
|   |-- frameworks
|   |-- prebuilts
|   |-- system
|   |-- external
|   |-- art.git
|   |-- bionic.git
|   |-- build.git
|   |-- cts.git
|   |-- dalvik.git
|   |-- development.git
|   |-- kernel.git
|   |-- libcore.git
|   |-- libnativehelper.git
|   |-- ndk.git
|   |-- pdk.git
|   `-- sdk.git
`-- project.list  // project의 name 의 list 확인가능