git clone --mirror와 git clone --bare의 차이점은 무엇입니까?


486

git clone 도움말 페이지에는 다음과 같은 내용이 있습니다 --mirror.

원격 저장소의 미러를 설정하십시오. 이 의미합니다 --bare.

그러나 --mirror클론이 클론과 어떻게 다른지에 대해서는 자세히 설명하지 않습니다 --bare.


3
도움이되지만이 미러를 github와 같은 원격 저장소로 푸시하려면 이 링크가 유용 하다는 것을 알았습니다 .
Joes at

답변:


569

차이점은 사용하는 경우이다 --mirror, 모든 심판이 복사됩니다 그대로 . 이는 원격 추적 분기, 메모, 참조 / 원본 / * (필터 분기의 백업) 등 모든 것을 의미합니다. 복제 된 저장소에는 모든 것이 있습니다. 또한 원격 업데이트가 원점에서 모든 것을 다시 가져 오도록 설정되어 있습니다 (복사 된 참조를 덮어 쓰기). 아이디어는 실제로 저장소를 미러링하여 전체 사본을 확보하여 예를 들어 중앙 저장소를 여러 위치에서 호스팅하거나 백업 할 수 있습니다. 훨씬 더 우아한 git 방식을 제외하고 repo를 똑바로 복사하는 것을 생각해보십시오.

새로운 문서는 거의 모든 것을 말합니다 :

--mirror

소스 저장소의 미러를 설정하십시오. 이 의미합니다 --bare. 비교 --bare, --mirror뿐만 아니라 대상의 로컬 브랜치에 대한 소스의 로컬 브랜치 매핑, 모든 이러한 심판에 의해 덮어 지도록 refspec 구성 위로 설정 (원격 지점, 메모 등을 포함한) 모든 심판 맵핑 git remote update대상 저장소를 .

내 원래 답변은 베어 클론과 일반 (비 베어) 클론의 차이점을 지적했습니다. 비 베어 클론은 원격 추적 분기를 설정하고에 대한 로컬 분기 만 생성하는 HEAD반면 베어 클론은 분기를 직접 복사합니다.

가정하자 기원은 몇 가지 (이 master (HEAD), next, pu, 및 maint), 일부 태그 ( v1, v2, v3), 일부 원격 지점 ( devA/master, devB/master), 그리고 몇몇 다른 심판 ( refs/foo/bar, refs/foo/baz, 메모, 숨겨 놨다는 다른 DEVS '네임 스페이스, 누가 알 수 있습니다).

  • git clone origin-url(비 베어) : 복사 한 모든 태그를 얻을 것이다, 로컬 브랜치는 master (HEAD)원격 브랜치를 추적 origin/master, 원격 지사 origin/next, origin/puorigin/maint. 추적 지점은과 같은 작업을 수행 git fetch origin하면 예상대로 가져올 수 있도록 설정됩니다 . 복제 된 원격의 모든 원격 브랜치 및 다른 참조는 완전히 무시됩니다.

  • git clone --bare origin-url: 당신은 복사 한 태그, 지역 지점의 모든 얻을 것이다 master (HEAD), next, pu,와 maint, 더 원격 추적하지 가지. 즉, 모든 브랜치는 그대로 복사되며 다시 가져 오기를 기대하지 않고 완전히 독립적으로 설정됩니다. 복제 된 원격의 모든 원격 브랜치 및 다른 참조는 완전히 무시됩니다.

  • git clone --mirror origin-url: 해당 참조 중 마지막 하나는 그대로 복사됩니다. 당신은 모든 태그, 지역 지점 얻을 것이다 master (HEAD), next, pu,와 maint, 원격 지사 devA/masterdevB/master다른 심판을 refs/foo/bar하고 refs/foo/baz. 모든 것이 복제 된 리모컨과 동일합니다. 원격 추적은 git remote update미러를 삭제하고 반론 한 것처럼 모든 참조를 원점에서 덮어 쓰도록 설정됩니다. 문서가 원래 말했듯이 거울입니다. 원본과 호환 가능한 기능적으로 동일한 사본이어야합니다.


"정상 복제본"은 --bare 또는 --mirror 플래그가없는 복제본을 나타 냅니까?
Sam

1
예, 그렇습니다. 맨 페이지에 나와있는 것처럼 베어 클론을 사용하면 분기도 직접 복사됩니다 (참조 / 원격 / 원산지, 추적 없음). 편집.
Cascabel

자식 내부 차이뿐만 아니라 차이점에 대한 사용 예를 더 추가 할 수 있습니까?
cmcginty

@Casey는 당신이 찾고 있던 것입니까? 처음에 쓴 내용은 "내부"라고 생각하지 않았습니다. 태그와 브랜치는 매우 많은 도자기 기능입니다.
Cascabel

"있는 그대로 복사 된 분기"는 분기가 복제본의 동일한 상대 경로로 복사되는 것을 의미합니까? 아니면 가지가 어떤 식으로 변형되었다는 것을 의미합니까?
Sam

56
$ git clone --mirror $URL

속기입니다

$ git clone --bare $URL
$ (cd $(basename $URL) && git remote add --mirror=fetch origin $URL)

( 여기 에서 직접 복사 )

현재 맨 페이지에 넣는 방법 :

비교 --bare, --mirror뿐만 아니라 대상의 로컬 브랜치에 대한 소스의 로컬 브랜치 매핑, 모든 이러한 심판에 의해 덮어 지도록 refspec 구성 위로 설정 (원격 지점, 메모 등을 포함한) 모든 심판 맵핑 git remote update대상 저장소를 .


4
나는 git fetch그것이 실제로 동일하기 위해서는 그것을 따라야한다고 생각 합니다. 어쨌든, 이것은 일종의 대답이 아닙니다. 문제의 핵심은 "미러 리모컨 / 복제는 일반 리모컨과 어떻게 다른가?"입니다.
Cascabel

6
나는 실제로 차이점을 보여주는이 방법을 좋아합니다. 잘만되면 그것은 정확하다! hfs가 페치 명령을 추가하기를 바랍니다.
joeytwiddle

예를 들어 $ (basename $ URL)이 무엇으로 번역되는지 등은 명확하지 않습니다.
Kzqai

5
basename경로의 디렉토리 부분을 제거하는 일반적인 유닉스 유틸리티이며 $()bash의 명령 대체입니다.
Victor Zamanian

6
이것은 여전히 ​​그 --mirror안에 있습니다. 이것이 무엇을 설명했는지 만 받아 들일만한 대답 일 것 git remote add --mirror입니다.
Zenexer

24

git-2.0.0으로 테스트 한 결과 --mirror 옵션은 후크, 구성 파일, 설명 파일, 정보 / 제외 파일 및 적어도 테스트 케이스에는 몇 가지 참조 (복사본)를 복사하지 않습니다. 이해하지 못합니다.) "원본과 호환되는 기능적으로 동일한 사본"이라고 부르지 않습니다.

-bash-3.2$ git --version
git version 2.0.0
-bash-3.2$ git clone --mirror /git/hooks
Cloning into bare repository 'hooks.git'...
done.

-bash-3.2$ diff --brief -r /git/hooks.git hooks.git
Files /git/hooks.git/config and hooks.git/config differ
Files /git/hooks.git/description and hooks.git/description differ
...
Only in hooks.git/hooks: applypatch-msg.sample
...
Only in /git/hooks.git/hooks: post-receive
...
Files /git/hooks.git/info/exclude and hooks.git/info/exclude differ
...
Files /git/hooks.git/packed-refs and hooks.git/packed-refs differ
Only in /git/hooks.git/refs/heads: fake_branch
Only in /git/hooks.git/refs/heads: master
Only in /git/hooks.git/refs: meta

14

리포지토리 복제 에 대한 GitHub 설명서의 미묘한 설명 :

베어 클론과 마찬가지로 미러 클론에는 모든 원격 브랜치 및 태그가 포함되지만 페치 할 때마다 모든 로컬 참조를 덮어 쓰므로 항상 원본 리포지토리와 동일합니다.


1
감사합니다; 미러 클론을 사용하여 분기뿐만 아니라 로컬 태그 도 덮어 쓰게 된다는 것이 명확 해졌습니다 . 매우 도움이됩니다.
와일드 카드

2
--prune더 이상 원격에없는 로컬 참조를 제거하기 위해 git fetch를 실행할 때 사용할 수도 있습니다 .
nishanths

13

클론은 리모컨에서 참조를 복사하여 '원격이 가진 참조'라는 하위 디렉토리에 넣습니다.

거울은 리모컨에서 심판을 복사하여 자체 최상위 레벨에 넣습니다. 자신의 심판을 리모컨의 심판으로 대체합니다.

즉, 누군가 미러에서 가져 와서 미러의 참조를 자신의 하위 디렉토리에 넣을 때 원래와 동일한 참조를받습니다. 최신 미러에서 가져 오는 결과는 초기 리포지토리에서 직접 가져 오는 것과 같습니다.


12

그림을 추가하고 config거울과 맨손의 차이를 보여줍니다 . 여기에 이미지 설명을 입력하십시오 왼쪽은 맨손이고 오른쪽은 거울입니다. 당신은 명확 수, 거울의 config 파일이 fetch당신에 의해, 업데이트 할 수있는 수단, 키 git remote update또는git fetch --all


3
$ git clone --bare https://github.com/example

이 명령은 새로운 자체를 $ GIT_DIR로 만듭니다. 또한 리모콘의 분기 헤드가 매핑없이 해당 로컬 분기 헤드로 직접 복사됩니다. 이 옵션을 사용하면 원격 추적 분기 나 관련 구성 변수가 만들어지지 않습니다.

$ git clone --mirror https://github.com/example

베어 클론과 마찬가지로 미러 클론에는 모든 원격 브랜치 및 태그가 포함되지만 페치 할 때마다 모든 로컬 참조 (원격 추적 브랜치, 노트 등 포함)가 덮어 쓰기되므로 항상 원본 리포지토리와 동일합니다. .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.