| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 우분투
- android
- linux
- Python
- ORIG_HEAD
- gerrit
- minicom
- Screen
- log
- vim
- rebase
- vi
- Configuration
- 설정
- repo
- jni
- am
- Git
- Serial
- expandtab
- bash
- 리눅스
- 로그인
- Tip
- Firefox
- Shell
- kernel
- rfc2119
- Thunderbird
- error
- Today
- 30
- Total
- 355,108
땅뚱 창고
git clone 의 두가지 옵션 --bare / --mirror 의 차이점 본문
git clone 옵션중 --mirror / --bare 가 있는데, 둘간의 차이점이 무엇인지 알아보자. 우선 git clone 의 도움말을 보면 다음과 같다.
--bare
GIT repository 를 bare 로 만든다. 즉 <directory> 를 생성하고 <directory>/.git 을 생성하는 대신에 <directory> 자체를 $GIT_DIR 로 만든다. 이 옵션은 기본적으로 -n 옵션을 포함하는데, 그 이유는 working tree 를 체크아웃할 곳이 없기 때문이다. 또한 remote 의 branch heads 가 refs/remotes/origin 으로 매핑되지 않고, 관련된 local branch heads 로 바로 복사된다. 이 옵션이 사용되면, remote-tracking branches 와 관련된 configuration 변수는 생성되지 않는다.
--mirror
remote repository 의 복사본을 만든다. 이것은 --bare 옵션을 포함한다.
--no-checkout, -n
clone 이 완료된 이후에 HEAD 를 checkout 하지 않는다.
도움말을 보더라도 무슨 의미인지 잘 이해가 되지 않는다.
우선 git_test 프로젝트를 만들어서 위 3가지 옵션을 사용하여 clone 명령을 사용해 보았다.
# git clone git://<ip>/git_test git_test
# git clone --bare git://<ip>/git_test git_test_bare
# git clone --mirror git://<ip>/git_test git_test_mirror
# ls git_test
readme.txt .git
# ls git_test_bare
branches/ config description HEAD hooks/ info/ objects/ packed-refs refs/
# ls git_test_mirror
branches/ config description HEAD hooks/ info/ objects/ packed-refs refs/
# diff -ruN git_test_bare/ git_test_mirror/
diff -ruN git_test_bare//config git_test_mirror//config
--- git_test_bare//config 2012-12-04 20:22:50.608895001 +0900
+++ git_test_mirror//config 2012-12-04 20:22:59.108895002 +0900
@@ -2,3 +2,7 @@
repositoryformatversion = 0
filemode = true
bare = true
+[remote "origin"]
+ fetch = +refs/*:refs/*
+ mirror = true
+ url = git://yourserver.com/git_test
non-bare clone (normal clone) 의 경우에는 실제 HEAD 를 가리키는 파일을 확인할 수 있는 반면, bare clone 은 repository 자체를 복사해오는 것으로 보인다. --mirror / --bare 의 차이점을 확인하기 위해서 diff 를 해보았는데, config 파일에서 원격 브랜치의 정보만 차이가 발생하고 있다.
이것만 가지고는 어떤 차이인지 명확하게 알지 못하겠다. 다시 인터넷을 검색해보았다.
위 내용을 번역해보면,
----
새로운 git 문서에서 --mirror / --bare 의 차이점을 다음과 같이 설명하고 있다.
--mirror
소스 repository 의 mirror 를 설정한다. 이 옵션은 --bare 옵션을 포함한다. --bare 옵션과 비교해서 --mirror 는 원본의 지역 브랜치와 타겟의 지역 브랜치에 매핑할 뿐 아니라, 모든 refs (원격 브랜치, notes 를 포함하여)를 매핑한다. 그리고, 모든 refs 는 목적(target) repository 에서 git remote update 를 실행함으로써 refspec 구성(configuration) 을 설정한다.
위 사이트를 참고하면, bare clone 과 non-bare clone 사이의 차이점은 간단하게, bare clone 브랜치를 직접 복사하는 반면, non-bare clone 은 원격 추적 브랜치를 설정하고, HEAD 를 위한 지역 브랜치만을 생성한다.
좀더 추가하여, 원본이 다음과 같은 브랜치(master (HEAD), next, pu, maint)를 가지고 있고, 몇가지 태그(v1, v2, v3), 몇가지 브랜치(devA/master, devB/master), 그리고 기타 refs (notes 나 stashes, 기타 알고있는 개발자의 namespaces 가 될 수 있는 refs/foo/bar, refs/foo/baz) 를 가지고 있는 것을 가정할 경우 각 명령에 대한 차이점을 아래와 같이 설명해 놓았다.- git clone origin-url (non-bare)
모든 태그, 원격 브랜치 origin/master 를 추적(tracking) 하는 지역 브랜치 master (HEAD) 그리고, 원격 브랜치 origin/next, origiin/pu 그리고 origin/maint 를 얻어온다. 그 추적 브랜치(the tracking branch)는 git fetch origin 과 같은 작업을 수행할 경우에 설정(set up)되고, 그 작업을 통해서 예상하는 것을 가져올 것이다. 클론된 원격 저장소내의 모든 원격 브랜치와 기타 refs 는 완전히 무시된다.
- git clone --bare origin-url
모든 태그, 지역 브랜치 master, next, pu 그리고 maint 를 얻어오고, 원격 추적 브랜치는 제외한다. 즉 모든 브랜치는 현재 상태로 복사되고, 다시 가져오기를 하지 않도록, 완전히 독립적으로 설정된다. 모든 원격 브랜치(복사된 원격내에서)와 기타 refs 는 완전히 무시된다.
- git clone --mirror origin-url
모든 마지막 refs 가 현재 상태로 복사될 것이다. 모든 태그, 지역 브랜치 master (HEAD), next, pu 그리고 maint, 원격 브랜치 devA/master 그리고 devB/master, 기타 ref refs/foo/bar 그리고 refs/foo/baz 를 가져올 것이다. 모든 것은 복사된 원격에서 존재하는 상태와 동일할 것이다. 원격 추적은 git remote update 를 실행하면 마치 mirror 를 지우고 다시 복사한 것처럼(recloned) 모든 refs 가 origin 으로부터 덮어쓰여지도록 설정된다. 문서에서 처음부터 말한 것 처럼 이것은 mirror 이다. 이것은 기능적으로 원본과 교환이 가능한, 복사(copy)와 동일하다.
----
어렴풋이. git clone --mirror 는 git remote origin 으로 원본 repository 에서 다시 reclone 이 가능하지만, git clone --bare 는 원본과 완전히 독립적으로 구성되는 것이 차이점인 것 같다. 테스트한 결과를 아래에 붙이도록 하겠다.
'IT 기술 > 개발환경_유틸 관련 팁' 카테고리의 다른 글
| Vim statusline 설정 (0) | 2013.02.19 |
|---|---|
| flashbench 사용법 (0) | 2013.01.11 |
| git clone 의 두가지 옵션 --bare / --mirror 의 차이점 (0) | 2012.12.03 |
| repo 를 사용하여 프로젝트 관리하기 (5) | 2012.12.03 |
| [Make] PHONY / FORCE (0) | 2012.11.12 |
| [gcc] floating point ABI 에 대해서 (0) | 2012.11.06 |