Soy's Devlog
[git 명령어 정리] git clone - normal, bare, mirror 본문
최근 원격의 레파지토리를 커밋이력까지 복사해 올 일이 있었는데, 그 과정에서 궁금한 것이 생겨 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을 받아 확인해 보았다.
config의 용량이 다른 것 빼고는 모두 동일하다.
두 로컬 레파지토리를 diff 로 비교해 보면 아래와 같이 mirror로 clone받은 레파지토리의 config에 refs가 추가로 보여지는 것을 확인할 수 있다.
'Git' 카테고리의 다른 글
특정 작업 취소하기 - reset, revert (0) | 2022.02.04 |
---|---|
non-fast-forward 에러 원인과 해결 (0) | 2022.01.27 |
Personal Access Token 발급 후 적용 (0) | 2022.01.23 |
homebrew-core is a shallow clone 에러 해결 (0) | 2022.01.22 |
특정 repository 커밋 이력까지 그대로 가져오기 (0) | 2022.01.17 |