땅뚱 창고

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

IT 기술/개발환경_유틸 관련 팁

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

땅뚱렁얼 2012. 12. 3. 18:03

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

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

참고 사이트 : 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/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 는 원본과 완전히 독립적으로 구성되는 것이 차이점인 것 같다. 테스트한 결과를 아래에 붙이도록 하겠다.


Tag
, , ,
0 Comments
댓글쓰기 폼