본문 바로가기
IT 기술/개발환경_유틸 관련 팁

git clone 의 두가지 옵션 --bare / --mirror 의 차이점

by 땅뚱 2012. 12. 3.

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 파일에서 원격 브랜치의 정보만 차이가 발생하고 있다.

이것만 가지고는 어떤 차이인지 명확하게 알지 못하겠다. 다시 인터넷을 검색해보았다.

 

참고 사이트 : http://stackoverflow.com/questions/3959924/whats-the-difference-between-git-clone-mirror-and-git-clone-bare

위 내용을 번역해보면, 아래와 같다.

----

새로운 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