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 명령을 사용해 보았다.
# normal clone
$ git clone git://<ip>/git_test git_test
$ ls git_test
readme.txt .git
# clone with --bare option
$ git clone --bare git://<ip>/git_test git_test_bare
$ ls git_test_bare
branches/ config description HEAD hooks/ info/ objects/ packed-refs refs/
# clone with --mirror option
$ git clone --mirror git://<ip>/git_test git_test_mirror
$ ls git_test_mirror
branches/ config description HEAD hooks/ info/ objects/ packed-refs refs/
# diff --bare and --mirror option
$ 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-url 의 모든 태그, 원격 브랜치인 origin/master 를 추적(tracking)하는 지역 브랜치 master(HEAD)와 원격 브랜치 origin/next, origin/pu, origin/maint 를 얻어온다. 각 브랜치들은 git fetch origin 과 같은 명령을 수행할 경우에 수정내용을 원격 저장소로 부터 가져올 수 있도록 추적 브랜치(tracking branches) 로 설정된다. 복제된 원격 저장소내의 모든 remote branches 와 기타 refs 는 완전히 무시된다.
$ git clone --bare origin-url
non-bare 명령과 유사하게 origin-url 의 모든 태그, master(HEAD), next, pu, maint 지역 브랜치들을 얻어온다, 원격 추적 브랜치들은 설정되지 않는다. 즉 모든 브랜치들은 이후 다시 fetching 을 할 수 없도록 복사되고, 완전히 독립적으로 설정된다. 복제된 원격 저장소내의 모든 remote branches 와 refs 는 완전히 무시된다.
$ git clone --mirror origin-url
모든 마지막 refs 가 그대로 복사될 것이다. 모든 태그, 로컬 브랜치인 master(HEAD), next, pu, maint, 리모트 브랜치 devA/master, devB/master, 모든 refs 인 refs/foo/bar, refs/foo/baz 를 가져온다. 모든 것이 정확하게 복제된 원격 저장소에 있던 것 그대로 복사된다. git remote update 명령을 수행하면 refs 가 origin 으로부터 얻어온 내용으로 덮어쓰여진다. (마치 mirror 를 지우고 다시 reclone 한 것처럼) 기능적으로 똑같은 복사본이고, 원본과 교체될 수 있다.
어렴풋이, git clone --mirror 는 git remote origin 으로 원본 repository 에서 다시 reclone 이 가능하지만, git clone --bare 는 원본과 완전히 독립적으로 구성되는 것이 차이점인 것으로 판단된다.
위 diff 결과에서 mirror 에는 remote origin 의 정보가 남아있는 것으로 보아 mirror 의 경우에는 복제한 원본의 정보를 가지고 있다가 해당 원본의 수정사항을 clone --mirror 한 곳에 반영할 수 있도록 설정되고, --bare 의 경우에는 remote origin 의 정보가 없기 때문에 더 이상 clone 한 원격 저장소에 대한 tracking 이 불가능하다.
위 설명중에 "복제된 원격 저장소내의 모든 remote branches 와 기타 refs 는 완전히 무시된다." 는 원격 저장소에 설정되어있는 remote repository 에 대한 내용은 clone 으로 복제가 안된다는 의미로 추정되는데, 테스트는 해보지 않았다 (테스트를 해보신 분 있으시면 댓글 좀 부탁드려요)
'IT 기술 > 개발환경_유틸 관련 팁' 카테고리의 다른 글
git 명령어 모음 (0) | 2013.04.09 |
---|---|
flashbench 사용법 (0) | 2013.01.11 |
repo 를 사용하여 프로젝트 관리하기 (5) | 2012.12.03 |
[Make] PHONY / FORCE (0) | 2012.11.12 |
[gcc] floating point ABI 에 대해서 (0) | 2012.11.06 |