Soy's Devlog

[git 명령어 정리] git clone - normal, bare, mirror 본문

Git

[git 명령어 정리] git clone - normal, bare, mirror

소이리 2022. 1. 24. 11:38

최근 원격의 레파지토리를 커밋이력까지 복사해 올 일이 있었는데, 그 과정에서 궁금한 것이 생겨 clone 옵션을 알아봤다.

 

Clone 이란

git에서 clone 은 원격의 레파지토리의 전체나 일부를 로컬로 가져오는 것이다.

pull 또한 로컬로 받아오는 것은 맞지만 둘의 차이점은

clone 은 로컬에 기존의 내용이 없을 때 신규로 받아오는 것이고, pull 은 로컬에 존재하는 내용에 추가로 원격의 것을 받아올 때 사용한다.

 


1. normal (non-bare)

git clone 레파지토리URL

clone한다고 하면 가장 흔하게 non-bare로 받아오는데 이 경우 가져올 수 있는 것은 아래와 같다.

 

  • 복사된 모든 태그
  • 원격 브랜치를 추적하는 로컬 브랜치 마스터 (HEAD)
  • 모든 원격브랜치
  • working tree에 있는 소스코드
  • 커밋이력

 

2. bare 

git clone --bare 레파지토리URL

 

로컬에 디렉토리를 만들고 bare로 clone을 했다면 .git의 확장자로 받아지며, 해당 로컬 디렉토리 자체를 $GIT-DIR로 만든다.

working tree는 포함하고 있지 않기 때문에 소스코드는 당연히 없고 --no-checkout 옵션을 적용했을 때와 같은 상태이다.

또한, 원격지의 HEAD는 refs/remotes/origin에 매핑 없이 해당 로컬 HEAD에 직접 복사된다. 

관련 구성 변수나 원격 추적 브랜치 등이 생성되지 않는다고 하는데 정리하면! 포함하는 것은 아래와 같다. 

 

  • 커밋이력 
  • 모든 원격브랜치 (원격 참조는 하지 않고 독립적으로 설정됨)

 

3. mirror

git clone --mirror 레파지토리URL

말그대로 거울처럼 모든것을 있는 그대로 복사한다.

clone하게 되면 .git 확장자로 받아지기에 언뜻 봤을때는 bare와 차이 없어 보일 수 있다. 

하지만 차이점은 mirror는 소스의 로컬 브랜치 뿐 아니라 target의 로컬 브랜치도 매핑해 주며, 모든 참조(refs)를 매핑해 준다.

 

  • 커밋이력
  • 모든 refs 
  • target에 포함되어 있는 정보

직접 git에 연결하여 bare와 mirror 옵션으로 각각 clone을 받아 확인해 보았다.

 

clone --bare
clone --mirror

 

config의 용량이 다른 것 빼고는 모두 동일하다.

두 로컬 레파지토리를 diff 로 비교해 보면 아래와 같이 mirror로 clone받은 레파지토리의 config에 refs가 추가로 보여지는 것을 확인할 수 있다.

 

Comments