베어 (Bare) 저장소와 비 -Bare 저장소의 실제 차이점은 무엇입니까?


213

Git의 베어 및 비 베어 / 기본 리포지토리에 대해 읽었습니다. 나는 그들 사이의 차이점에 대해 (이론적으로) 잘 이해하지 못했고 왜 베어 저장소에 "푸시"해야 하는지를 알 수 없었습니다. 거래는 다음과 같습니다.

현재 3 대의 컴퓨터에서 프로젝트를 수행하는 유일한 사람이지만 나중에 더 많은 사람들이 참여할 것이므로 버전 제어에 Git을 사용하고 있습니다. 모든 컴퓨터에서 Bare Repo를 복제하고 그 중 하나에서 수정을 마치면 Bare Repo로 변경 내용을 커밋하고 푸시합니다. 내가 읽은 내용에서 베어 저장소에는 "작업 트리"가 없으므로 베어 저장소를 복제하면 "작업 트리"가 없습니다.

워킹 트리는 프로젝트의 커밋 정보, 분기 등을 저장한다고 생각합니다. 그것은 맨손 저장소에 나타나지 않을 것입니다. 따라서 작업 트리를 사용하여 저장소에 커밋을 "밀어 넣는"것이 더 나을 것 같습니다.

그렇다면 베어 저장소를 사용해야하는 이유는 무엇입니까? 실질적인 차이점은 무엇입니까? 그것은 더 많은 사람들이 프로젝트를 수행하는 데 도움이되지 않을 것이라고 생각합니다.

이런 종류의 일에 대한 당신의 방법은 무엇입니까? 제안?


4
AeroCross에서는 베어 리포지토리를 복제하여 비 베어 리포지토리 (즉, 작업 영역이있는 리포지토리)를 만들 수 있습니다 . 따라서 git clone베어 리포지토리와 비 베어 리포지토리간에 자유롭게 변환 할 수 있습니다.
Derek Mahar

13
@ AeroCross : 변환에 관한 것이 아닙니다. 다른쪽에는 무엇이 중요하지 않습니다. 당신이 실행 git clone --bare하면 베어 리포지토리를 얻을 것이고, 실행 하면 베어 git clone가 아닌 리포지토리를 얻게됩니다. 복제 한 모든 공개 프로젝트 (예 : github에서 호스팅 됨)는 다른 쪽 끝의 베어 리포지토리입니다.
Cascabel

1
Jefromi, 저는 AeroCross의 요점을 수정하고있었습니다. "맨손으로 레포를 복제하면"작업 트리 "가 없기 때문에 일종의 변환입니다. 모든 공개 프로젝트가 베어 리포지토리가 아니어야합니다. 베어 트리 저장소는 작업 트리가 없기 때문에 공간 효율적이므로 작업 트리가없는 저장소만큼 공간 효율적이기 때문에 일반적인 선택입니다.
Derek Mahar

2
@Derek : 그러나 요점은 .git 디렉토리를 찾 자마자 가져 오는 것이 원격이 맨손인지 여부를 완전히 알지 못한다는 것입니다. 변환하지 않습니다. 리모컨에서 필요한 것을 가져 와서 어디로 가야합니까? 변환 할 것이 없습니다. 그것이 OP에 강조하려고했던 것입니다. 그리고 저는 공공 프로젝트가 노출 될 필요는 없지만 사람들이 어리석지 않기 때문에 본질적으로 모두 있습니다. 나는 수용 가능한 일반화를했다고 생각한다.
Cascabel

2
Bare 저장소 사용에 대한 다른 훌륭한 설명을 제공하는 Bare가 아닌 저장소로 푸시를 참조하십시오 .
Craig McQueen

답변:


95

Bare 저장소와 Bare가 아닌 저장소의 또 다른 차이점은 Bare 저장소에 기본 원격 오리진 저장소 가 없다는 것 입니다.

~/Projects$ git clone --bare test bare
Initialized empty Git repository in /home/derek/Projects/bare/
~/Projects$ cd bare
~/Projects/bare$ git branch -a
* master
~/Projects/bare$ cd ..
~/Projects$ git clone test non-bare
Initialized empty Git repository in /home/derek/Projects/non-bare/.git/
~/Projects$ cd non-bare
~/Projects/non-bare$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

매뉴얼 페이지에서 git clone --bare:

또한 리모콘의 분기 헤드는 해당 로컬 분기 헤드에 refs / remotes / origin /에 매핑되지 않고 직접 복사됩니다. 이 옵션을 사용하면 원격 추적 분기 나 관련 구성 변수가 만들어지지 않습니다.

베어 (Bare) 리포지토리를 생성 할 때 Git은 베어 리포지토리가 여러 원격 사용자의 오리진 리포지토리 역할을한다고 가정하므로 기본 원격 오리진을 생성하지 않습니다. 이것이 의미하는 것은 Git이 작업 공간이 없으면 베어 리포지토리에 대한 변경 사항을 커밋하지 않는다고 가정하기 때문에 기본 git pullgit push작업이 작동하지 않는다는 것입니다.

~/Projects/bare$ git push
fatal: No destination configured to push to.
~/Projects/bare$ git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
~/Projects/bare$ 

1
네, 이것이 베어 베어 및 비 베어 리포지토리 사이의 가장 중요한 차이점이라는 데 동의합니다. Bare가 아닌 저장소에 작업 공간이 있지만 Bare 저장소가 중요한 차이점은 아니지만 git clone --no-checkout작업 공간 파일이없는 Bare가 아닌 저장소도 작성할 수 있습니다.
Derek Mahar

10
Bare가 아닌 저장소에도 기본 원격 "origin"이 반드시 필요한 것은 아닙니다.
mipadi

2
를 사용하여 Git 리포지토리를 간단하게 만들 수 있으며 git init, 원격을 지정하지 않고 베어 리포지토리를 만들 수 있습니다 .
mipadi

1
mipadi, 이것은 사실이지만 복제품도 아닙니다.
Derek Mahar

1
이것은 올바르지 않습니다. 저장소는 기본 출처를 가지게됩니다 clone. 가 된 경우 init로컬 에드, 그러한 원점이 없습니다. 이것은 맨손인지 여부와 관련이 없습니다.
Noufal Ibrahim

62

작업 공간이 저장소의 일부가 아니고 저장소에 작업 공간이 필요하지 않기 때문에 베어 Git 저장소와 비 Bare Git 저장소의 구별은 인공적이고 오해의 소지가 있습니다. 엄밀히 말해 Git 리포지토리에는 리포지토리의 상태를 설명하는 개체가 포함됩니다. 이러한 오브젝트는 모든 디렉토리에 존재할 수 있지만 일반적으로 .git작업 공간의 최상위 디렉토리에있는 디렉토리에 존재합니다 . 작업 공간은 저장소의 특정 커밋을 나타내는 디렉토리 트리이지만 디렉토리에 존재하거나 전혀 존재하지 않을 수 있습니다. 환경 변수 $GIT_DIR는 작업 공간이 시작된 저장소에 작업 공간을 링크합니다.

힘내 명령 git clonegit init둘 다 --bare초기 작업 공간없이 저장소를 만드는 옵션 이 있습니다. 이 망할 놈의 작업 공간 및 저장소의 두 개의하지만 관련 개념을 conflates하고 혼란 용어가 사용하는 불행한 베어 두 개념을 분리 할 수 있습니다.


61

베어 리포지토리는 .git 폴더 자체에 지나지 않습니다. 즉 베어 리포지토리의 내용은 로컬 작업 리포지토리 내의 .git 폴더 의 내용과 동일 합니다.

  • 원격 서버에서 Bare Repository를 사용하여 여러 기고자가 작업을 진행할 수 있습니다.
  • 비 베어-작업 트리가있는 것은 프로젝트의 각 제공자의 로컬 컴퓨터에서 의미가 있습니다.

60

5 년이 너무 늦었지만, 실제로 아무도 그 질문에 대답하지 않았습니다.

그렇다면 베어 저장소를 사용해야하는 이유는 무엇입니까? 실질적인 차이점은 무엇입니까? 그것은 더 많은 사람들이 프로젝트를 수행하는 데 도움이되지 않을 것이라고 생각합니다.

이런 종류의 일에 대한 당신의 방법은 무엇입니까? 제안?

Loeliger / MCullough 책 (978-1-449-31638-9, p196 / 7)에서 직접 인용하려면 :

베어 리포지토리는 거의 사용되지 않는 것 같지만 그 역할은 매우 중요합니다. 협업 개발의 ​​권위있는 중심 역할을하는 것입니다. 다른 개발자 clonefetchBare 저장소에서 push업데이트 및 업데이트 ... 개발자가 push변경할 저장소를 설정 한 경우 Bare가 있어야합니다. 실제로 이것은 게시 된 리포지토리가 노출되어야하는보다 일반적인 모범 사례의 특별한 경우입니다.


19

Bare가 아닌 저장소에는 체크 아웃 된 작업 트리가 있습니다. 작업 트리에는 리포지토리의 상태 (분기, 태그 등)에 대한 정보가 저장되지 않습니다. 오히려 작업 트리는 repo의 실제 파일을 나타 내기 때문에 파일 작업 (편집 등)을 수행 할 수 있습니다.


즉 베어 브랜치 저장소에 브랜치, 태그 등을 추가 한 다음 베어 베어 / 비 생산 리포지토리로 가져올 수 있습니까?
AeroCross

2
베어 본이 아닌 저장소에는 체크 아웃 된 트리가 없을 수 있습니다. 를 사용하여 Bare 이외의 저장소를 작성하는 경우에 해당합니다 git clone --no-checkout. 이 경우, Bare가 아닌 저장소에는 작업 공간의 위치가 있지만 Git은 해당 작업 공간으로 파일을 체크 아웃하지 않습니다.
Derek Mahar

17

베어 리포지토리는 다음과 같은 이점이 있습니다.

  • 디스크 사용량 감소
  • 원격 푸시와 관련된 문제 감소 (작업 트리가 동기화에서 벗어나거나 충돌하는 변경 사항이 없기 때문에)

3
베어 저장소는 THEIR 저장소에 액세스 할 수없는 여러 사람들과 함께 작업하는 가장 좋은 방법입니다. (SVN을 좋아 하는가?)
AeroCross

2
AeroCross, 베어 리포지토리가 해당 시나리오에 적합한 선택이라고 말하고 싶습니다.
Derek Mahar

12

베어 저장소가 아닌 경우 새 커밋을 만들어 (작업 트리로) 변경 사항을 캡처 할 수 있습니다.

베어 리포지토리는 다른 리포지토리에서 변경 내용을 전송해야만 변경됩니다.


10

나는 Git "전문가"가 아니다. 나는 TortoiseGit을 한동안 사용해 왔으며, 내가 그것을 만들 때마다 "맨손으로"레포를 만들고 싶을 때 그것이 무엇에 관한 것인지 궁금했다. 나는이 자습서를 읽고 있었다 : https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-init 문제를 해결하지만 여전히 개념을 이해하지 못했습니다. 이것은 많은 도움이되었습니다 : http://bitflop.com/tutorials/git-bare-vs-non-bare-repositories.html . 이제 첫 번째 것도 의미가 있습니다!

이러한 소스에 따르면, 배포 지점을 설정하려는 서버에서 간단히 "베어"저장소가 사용됩니다. 로컬 컴퓨터에서 사용하도록 의도되지 않았습니다. 일반적으로 로컬 컴퓨터에서 원격 서버의 베어 리포지토리로 커밋을 푸시하고 사용자 및 / 또는 다른 사용자는 해당 베어 리포지토리에서 로컬 컴퓨터로 커밋합니다. 따라서 GitHub, Assembla 등의 원격 저장소 / 배포 저장소는 "베어"저장소가 만들어지는 예입니다. 당신은 당신 자신의 유사한 "공유 센터"를 설정했다면 당신 자신을 만들 것입니다.



9

기본 / 비 베어 Git 저장소에는 두 가지 상태가 있습니다.

  1. 저장소에있는 모든 파일 의 스냅 샷 (Git 전문 용어에서 "작업 트리"가 의미하는 것)
  2. 역사 이제까지 저장소에 있었던 모든 파일에 대한 모든 변경 (이 모두 포함 망할 놈의 전문 용어의 간결한 조각이있을 것 같지 않습니다)

스냅 샷은 아마 당신은 당신의 프로젝트로 생각하는 것입니다 : 코드 파일, 빌드 파일, 헬퍼 스크립트, 힘내와 다른 것을하면 버전.

역사는 다른 커밋을 체크 아웃하고 저장소의 파일이 추가 된 커밋 그 때 어떻게 생겼는지의 완전한 스냅 샷을 얻을 수있는 상태입니다. Git 내부에있는 많은 데이터 구조로 구성되어있어 직접 상호 작용 한 적이 없을 것입니다. 중요하게, 히스토리는 메타 데이터를 저장하지 않고 (예 : "사용자 U가 커밋 C의 일부로 시간 T에서 파일 F에이 많은 행을 추가했습니다") 데이터를 저장합니다 (예 : "사용자 U 가이 정확한 행 을 파일 F에 추가했습니다" ).

베어 리포지토리의 핵심 아이디어는 실제로 스냅 샷이 필요하지 않다는 것입니다. Git은 코드와 상호 작용하려는 사람과 다른 비 Git 프로세스에 편리하기 때문에 스냅 샷을 유지하지만 스냅 샷은 이미 기록에있는 상태를 복제하는 것입니다.

베어 저장소는 스냅 샷이없는 Git 저장소입니다. 단지 역사를 저장합니다.

왜 이것을 원하십니까? Git을 사용하여 파일과 만 상호 작용할 경우 (즉, 파일을 직접 편집하거나 실행 파일을 작성하는 데 사용하지 않음) 스냅 샷을 유지하지 않고 공간을 절약 할 수 있습니다. 특히 서버의 중앙 집중식 버전의 리포를 유지 관리하는 경우 (예 : 기본적으로 자체 GitHub를 호스팅하는 경우) 해당 서버에 베어 리포지토리가 있어야합니다. 로컬 머신은 스냅 샷을 편집하고 싶을 것입니다).

Bare Repos와 다른 예제 유스 케이스에 대한 자세한 설명을 원하시면 블로그 게시물을 작성하십시오 : https://stegosaurusdormant.com/bare-git-repo/


4

이것은 새로운 답변은 아니지만 위의 답변의 다양한 측면을 이해하는 데 도움이되었습니다 (댓글이 너무 많습니다).

Git Bash를 사용하여 다음을 시도하십시오.

me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../

me@pc MINGW64 /c/Test
$ git init
Initialized empty Git repository in C:/Test/.git/

me@pc MINGW64 /c/Test (master)
$ ls -al
total 20
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 .git/

me@pc MINGW64 /c/Test (master)
$ cd .git

me@pc MINGW64 /c/Test/.git (GIT_DIR!)
$ ls -al
total 15
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 ../
-rw-r--r-- 1 myid 1049089 130 Apr  1 11:35 config
-rw-r--r-- 1 myid 1049089  73 Apr  1 11:35 description
-rw-r--r-- 1 myid 1049089  23 Apr  1 11:35 HEAD
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 hooks/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 info/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 objects/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 refs/

동일 git --bare:

me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:36 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../

me@pc MINGW64 /c/Test
$ git init --bare
Initialized empty Git repository in C:/Test/

me@pc MINGW64 /c/Test (BARE:master)
$ ls -al
total 23
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 ./
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:11 ../
-rw-r--r-- 1 myid 1049089 104 Apr  1 11:36 config
-rw-r--r-- 1 myid 1049089  73 Apr  1 11:36 description
-rw-r--r-- 1 myid 1049089  23 Apr  1 11:36 HEAD
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 hooks/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 info/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 objects/

2

$ git help repository-layout

Git 저장소는 다음과 같은 두 가지 맛으로 제공됩니다.

  • 작업 트리의 루트에있는 .git 디렉토리;
  • 베어 리포지토리 (즉, 자체 작업 트리가없는) 인 .git 디렉토리 는 일반적으로 다른 디렉토리 로 푸시하여 가져 와서 히스토리를 교환하는 데 사용됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.