달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
=========================================================
11.10.02 수정 사항 - git 관련 정리 파일 수정하여 파일 첨부

=========================================================

Android Source 를 받을 때 repo 를 알게 되었고,
Android Source 를 받을 때만 repo 를 써 봤다.
다른 Source 관리에도 repo 를 쓰면 좋을 것 같은데 어떻게 해야 할까?

아직은 잘 모르겠지만 만약 myrepo_remote 라는 directory 에
repo 형식의 repo server 가 설정되어 있을 것이다.

$ mkdir myrepo_remote
$ cd myrepo_remote

그리고 myrepo_local 이라는 directory 를 만든다.

$ mkdir myrepo_local

위 repo server 에서 source 를 download 하려면
우선 repo 설정을 아래와 같이 할 것이다.
아라? 그런데 뭔가 android server 에서 download 한다.

myrepo_local$ repo init -u ../myrepo_remote/
Getting repo ...
   from git://android.git.kernel.org/tools/repo.git
remote: Counting objects: 1309, done.
remote: Compressing objects: 100% (570/570), done.
remote: Total 1309 (delta 843), reused 1148 (delta 716)
Receiving objects: 100% (1309/1309), 357.92 KiB | 141 KiB/s, done.
Resolving deltas: 100% (843/843), done.
From git://android.git.kernel.org/tools/repo
 * [new branch]      maint      -> origin/maint
 * [new branch]      master     -> origin/master
 * [new branch]      stable     -> origin/stable
 * [new tag]         v1.7.5     -> v1.7.5
From git://android.git.kernel.org/tools/repo
 * [new tag]         v1.0       -> v1.0
 * [new tag]         v1.0.1     -> v1.0.1
(생략)
 * [new tag]         v1.7.4.3   -> v1.7.4.3
Getting manifest ...
   from ../myrepo_remote/
fatal: '../myrepo_remote' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
fatal: cannot obtain manifest ../myrepo_remote/

마지막에 myrepo_remote directory 에 repo 설정이 안 되어 있어서 error 가 발생하지만,
.repo directory 가 생성되고, .repo/repo 에도 뭔가 잔뜩 만들어졌다.

myrepo_local$ ls -l .repo/
total 4
drwxr-xr-x 7 jaewon jaewon 4096 2011-08-15 10:51 repo

파일 확장자를 보니 파이썬 스크립트이고,
repo  관련 명령어를 처리해 주는 기능을 하는 것 같다.
그런데 .git directory 가 있는 것을 보니 Git 로 관리하는 것 같다.

myrepo_local$ ls -al .repo/repo/
total 380
drwxr-xr-x 7 jaewon jaewon  4096 2011-08-15 10:51 .
drwxr-xr-x 3 jaewon jaewon  4096 2011-08-15 10:51 ..
-rw-r--r-- 1 jaewon jaewon  3602 2011-08-15 10:51 color.py
-rw-r--r-- 1 jaewon jaewon  5239 2011-08-15 10:51 color.pyc
-rw-r--r-- 1 jaewon jaewon  3426 2011-08-15 10:51 command.py
-rw-r--r-- 1 jaewon jaewon  4625 2011-08-15 10:51 command.pyc
(생략)
drwxr-xr-x 8 jaewon jaewon  4096 2011-08-15 10:51 .git
(생략)

Git 안을 좀 들여다 보자.
local 에 remote/origin/stable 을 upstream 으로 하는 default branch 가 있다.

myrepo_local$ cd .repo/repo/
myrepo_local/.repo/repo$ git branch -avv
* default               30d4529 [origin/stable] Add a --depth option to repo init.
  remotes/origin/maint  08c880d Smart tag support
  remotes/origin/master e7a3bcb Merge branch 'stable'
  remotes/origin/stable 30d4529 Add a --depth option to repo init.

myrepo_local/.repo/repo$ cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git://android.git.kernel.org/tools/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "default"]
    remote = origin
    merge = refs/heads/stable

그럼 이런 Git 로 관리하는 repo 관련 파일들을
/usr/bin/repo 실행 한 번으로 모두 받은 것이다.
이쯤에서 궁금해진다.
repo 안에 Git 관련 설정은 어떻게 되어 있을까?

결론부터 얘기해서,
repo script 를 분석해서 Git 관련 부분만 모아보면 아래와 같았다.
참고적으로 mimic_repo_init.sh 라는 파일로 만들어서 테스트할 수 있다.

mkdir -p .repo_test/repo
cd .repo_test/repo

echo 'Getting repo ...'
echo '   from git://android.git.kernel.org/tools/repo.git'

git init --quiet
git config remote.origin.url git://android.git.kernel.org/tools/repo.git
git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch origin
git fetch --tags origin
cur=`git describe origin/stable`
#git tag -v $cur
rev="$cur^0"
# current rev is v1.7.5^0
git update-ref refs/heads/default $rev
git config branch.default.remote origin
git config branch.default.merge refs/heads/stable
git symbolic-ref HEAD refs/heads/default
git read-tree --reset -u HEAD

위 과정을 진행하고,
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 를 알아내는데 확인했던 부분 코드를 분석 없이 덧붙인다.


Posted by neodelicious
|