I want to say these.
- Like normal git, default.xml can set up several remote Repo and set one of them as default.
- each git can be retrieved from different remote Repo and either follows a branch or can be stuck on a specific commit.
android source 를 좀 보려고 repo init 을 했는데 아래와 같이 안 되었다.
$ repo init -u git://android.git.kernel.org/platform/manifest.git
Getting repo ...
from git://android.git.kernel.org/tools/repo.git
fatal: Unable to look up android.git.kernel.org (port 9418) (Name or service not known)
DNS 혹은 Port 문제인가 싶어서 이것 저것 다 확인하고 바꿔봤는데,
결론은 Android repo 의 git server 가 hacking 당해서 동작 안 한다는 것... 덜덜;;
http://php.webtutor.pl/en/2011/09/05/kernel-org-hacked-how-to-get-android-repo/
위 URL 에서 관련 사실을 확인했고 방법도 참고했는데, 9/5 날짜이니 나름 최근인가 보다.
사족인데 혹시나 해서 받은 repo 를 봤더니 역시 repo 의 default git URL 을 수정해 놓은 repo 였다. 위에서 받은 repo 를 사용하면 되는데, 굳이 이전에 받은 repo 를 사용하고자 한다면 --repo-url 옵션을 통해 repo 에 repo git URL 을 argument 로 전달하면 된다.
그리고 android platform 의 git server 도 hacking 당했는지 안 되는데 위 URL 에서 알려주듯이 아래와 같이 변경해서 받을 수 있다.
알겠지만 repo init 끝에 -b gingerbread 는 gingerbread branch 를 받는 것으로 원하면 생략하거나 다른 branch 값을 쓰면 된다.
참고적으로 android kernel 을 받으려면 repo project 를 통해서 받을 수도 있지만,
android kernel 의 git server 에서 다음과 같이 바로 git clone 할 수 있다.
$ git clone git://android.git.kernel.org/kernel/common.git kernel
그런데 현재 kernel 또한 server 에 문제가 있어 위의 대체 URL 을 이용해서 받을 수 있다.
$ git clone git://codeaurora.org/kernel/common.git kernel
위 과정을 진행하고,
repo init 한 것과 비교해 봤는데
repo init 에서 파이썬 스크립트가 더 있기는 했지만
Git 관련 파일은 거의 같다고 할 수 있었다.
myrepo_local$ repo init -u ../myrepo_remote
myrepo_local$ ./mimic_repo_init.sh
myrepo_local$ diff -qr .repo .repo_testOnly in .repo/repo: color.pyc
Only in .repo/repo: command.pyc
Only in .repo/repo: editor.pyc
Only in .repo/repo: error.pyc
Files .repo/repo/.git/index and .repo_test/repo/.git/index differ
Files .repo/repo/.git/logs/refs/heads/default and .repo_test/repo/.git/logs/refs/heads/default differ
Files .repo/repo/.git/logs/refs/remotes/origin/maint and .repo_test/repo/.git/logs/refs/remotes/origin/maint differ
Files .repo/repo/.git/logs/refs/remotes/origin/master and .repo_test/repo/.git/logs/refs/remotes/origin/master differ
Files .repo/repo/.git/logs/refs/remotes/origin/stable and .repo_test/repo/.git/logs/refs/remotes/origin/stable differ
Only in .repo/repo: git_command.pyc
Only in .repo/repo: git_config.pyc
Only in .repo/repo: git_refs.pyc
(생략)
끝으로 repo 를 다 분석하지는 못 했는데,
위 Git command 를 알아내는데 확인했던 부분 코드를 분석 없이 덧붙인다.
Android 에서는 Git 를 내부적으로 사용하면서 Repo 를 Wrapper 로 이용한다.
.repo 안에 어떻게 되어 있는 건지 궁금해서 들여다 봤다.
앞으로 더 봐야겠지만 오늘 분석한 것을 정리한다.
<download>
Android Source 전체를 받을 필요는 없고, repo sync 까지만 해서 .repo 안에 구조를 본다.
mkdir mydroid
cd mydroid/
repo init -u git://android.git.kernel.org/platform/manifest.git
<.repo>
.repo 안에 repo command 를 구현한 repo directory 가 있고,
.repo 내 프로젝트 설정 정보를 담고 있는 manifest.xml 파일이 있다.
그런데 manifest.xml 는 symbolic link 이고 실제 파일은 manifest directory 에 있는 default.xml 이다.
그런데 manifest.git 는 어떤 directory 인지 궁금했는데,
manifest.xml 을 git 로 관리하는 것이다.
참고적으로 repo sync 를 통해 Source 를 받고 나니,
project 에 대한 정보가 있는 파일이 더 생겼다.
이 부분은 나중에 확인해 봐야겠다.
// would be like this after repo sync
$ tree -L 1 .repo/
.repo/
|-- manifests
|-- manifests.git
|-- manifest.xml -> manifests/default.xml
|-- project.list
|-- projects
`-- repo
<manifests VS manifests.git>
directory가 두 개가 있는데 왜 두 개인지 궁금했다.
안을 들여다 보기 전에 우선 용량부터 확인했더니,
둘 다 용량이 작은데, manifests 가 훨씬 작았다.
$ du -sh .repo/manifests
104K .repo/manifests
$ du -sh .repo/manifests.git/
1.4M .repo/manifests.git/
ls 로 파일을 보니, manifests 에는 파일이 몇 개 있고,
.git 가 있는 것을 보니 Git 로 관리하고 있는 것으로 보인다.
$ du -sh .repo/manifests/.git/
12K .repo/manifests/.git/
Symbolic Link 라서 이건 껍데기려니 하고,
그냥 diff 로 차이가 있는 파일을 봤다.
다른 건 그럭저럭 눈에 안 뜨이는데 HEAD 파일이 다르다는 것이 이상하다.
$ diff -qr .repo/manifests/.git .repo/manifests.git
Only in .repo/manifests.git: branches
Only in .repo/manifests.git: FETCH_HEAD Files .repo/manifests/.git/HEAD and .repo/manifests.git/HEAD differ
Only in .repo/manifests/.git: index
Only in .repo/manifests/.git: packed-refs
Only in .repo/manifests.git: .repopickle_config
Only in .repo/manifests/.git: svn
<manifest>
manifest directory 를 좀 더 들여다 봤다.
$ cd .repo/manifests
config 파일을 열어 환경 설정을 보니,
origin remote 와 default branch 를 가진 일반적인 형태다.
다른 파일들이 Symbolic Link 이지만 config 파일은 mainifest.git 의 config 와 같은 내용이었다.
remote branch 를 포함해서 전체 branch 를 보니,
default 는 origin/master 즉 origin remote 에서 master branch 를 upstream 으로 하고 있다.
그밖에 Android 각 version 별로 branch 를 따로 만들어서 사용했던 것 같다.
내부적으로 최신 version 으로 merge 했을 것 같지만.
.repo/manifests$ git branch -avv * default dc01e28 [origin/master] Add new projects remotes/origin/android-1.5 1b4d95f fixed duplicate entry
remotes/origin/android-1.5r2 2de7a11 Manifest for 1.5r2
(생략) remotes/origin/master dc01e28 Add new projects (생략)
<manifest.git>
그럼 manifest.git directory 는 어떻게 되어 있을까?
$ cd .repo/manifests.git/
branch 정보를 봤는데, manifest 와 같은 것 같다.
아라? 그런데 local default branch 에 현재 branch 를 가리키는 * 가 없다.
HEAD 값이 어떻게 되어 있길래?
.repo/manifests.git$ git branch -avv
default dc01e28 [origin/master] Add new projects
remotes/origin/android-1.5 1b4d95f fixed duplicate entry
remotes/origin/android-1.5r2 2de7a11 Manifest for 1.5r2
...
remotes/origin/master dc01e28 Add new projects
...