답변:
이 변형은 작업 디렉토리가있는 저장소를 작성하므로 실제로 작업 할 수 있습니다 ( git clone). 디렉토리를 생성하면 디렉토리에 히스토리와 모든 git 배관이 진행되는 .git 폴더가 포함되어 있음을 알 수 있습니다. .git 폴더가있는 레벨에서 작업합니다.
다른 변형은 작업 디렉토리 ( git clone --bare) 없이 리포지토리를 만듭니다 . 작업 할 수있는 디렉토리가 없습니다. 디렉토리의 모든 것은 이제 위의 경우 .git 폴더에 포함 된 것입니다.
작업 디렉토리없이 git repos가 필요하면 분기를 푸시 할 수 있고 누군가가 작업중 인 것을 관리하지 않는다는 것입니다. 베어되지 않은 저장소로 계속 푸시 할 수 있지만 누군가 작업중인 디렉토리에서 작업중인 브랜치를 잠재적으로 이동할 수 있으므로 거부됩니다.
따라서 작업 폴더가없는 프로젝트에서는 git가 저장 한 오브젝트 만 볼 수 있습니다. 그것들은 압축되고 직렬화되어 컨텐츠의 SHA1 (해시)하에 저장됩니다. Bare 저장소에 오브젝트를 가져 오려면 git show보고자하는 오브젝트의 sha1을 지정해야합니다. 프로젝트 모양과 같은 구조는 보이지 않습니다.
베어 리포지토리는 일반적으로 모든 사람이 작업을 수행하는 중앙 리포지토리입니다. 실제 작업을 조작 할 필요가 없습니다. 여러 사람의 노력을 동기화하는 방법입니다. 프로젝트 파일을 직접 볼 수 없습니다.
프로젝트에서 작업하는 유일한 사람이거나 "논리적 중앙"리포지토리를 원하지 않거나 필요로하지 않으면 베어 리포지토리가 필요하지 않을 수 있습니다. 하나는 선호 git pull 에서 이 경우에 다른 저장소. 이것은 베어가 아닌 리포지토리로 푸시 할 때 git의 반대 의견을 피합니다.
도움이 되었기를 바랍니다
Bare repositories are usually central repositories where everyone moves their work to.베어 리포지토리가 다른 프로젝트 공동 작업자가 프로젝트를 복제 할 수있는 소스라고 말합니까? 즉, 공동 작업자는이를 remote?
Bare 저장소는 작업 사본이없는 git 저장소이므로 .git의 컨텐츠는 해당 디렉토리의 최상위 레벨입니다.
Bare 이외의 저장소를 사용하여 로컬로 작업하고 Bare 저장소를 중앙 서버 / 허브로 변경하여 다른 사람과 변경 사항을 공유하십시오. 예를 들어 github.com에서 리포지토리를 생성하면 베어 리포지토리로 생성됩니다.
따라서 컴퓨터에서 :
git init
touch README
git add README
git commit -m "initial commit"
서버에서 :
cd /srv/git/project
git init --bare
그런 다음 클라이언트에서 다음을 누릅니다.
git push username@server:/srv/git/project master
그런 다음 리모컨으로 입력하여 입력 내용을 저장할 수 있습니다.
서버 쪽의 저장소는 파일을 편집 한 다음 서버 시스템에서 커밋하지 않고 끌어서 놓기를 통해 커밋을 수행하므로 베어 리포지토리입니다.
베어 리포지토리가 아닌 리포지토리로 푸시 할 수 있으며 git은 .git 리포지토리가 있음을 알지만 대부분의 "허브"리포지토리에는 작업 복사본이 필요하지 않으므로 베어 리포지토리를 사용하는 것이 일반적입니다. 이런 종류의 리포지토리에 작업 복사본이 없어도 무방하므로 권장됩니다.
그러나 베어 저장소가 아닌 저장소로 푸시하면 작업 복사본이 일관성이 없으며 git이 경고합니다.
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
이 경고를 건너 뛸 수 있습니다. 그러나 권장되는 설정은 Bare가 아닌 저장소를 사용하여 로컬로 작업하고 Bare 저장소를 허브 또는 중앙 서버로 밀어서 가져 오는 것입니다.
다른 개발자의 작업 복사본과 직접 작업을 공유하려는 경우 푸시하지 않고 서로 다른 리포지토리에서 가져올 수 있습니다.
얼마 전에이 질문을 읽었을 때 모든 것이 혼란 스러웠습니다. 방금 git을 사용하기 시작 했으며이 작업 복사본이 있습니다 (당시 아무런 의미가 없었습니다). 용어에 대해 전혀 모르고 시작한 남자의 관점에서 이것을 설명하려고 노력할 것입니다.
차이점의 좋은 예는 다음과 같은 방법으로 설명 할 수 있습니다 .
--bare저장 장소를 제공합니다 (개발할 수 없음). --bare그것 없이는 당신이 그곳에서 개발할 수있는 능력을 갖게됩니다.
git init현재 디렉토리에서 자식 저장소를 만듭니다. 그 안에 .git 폴더가 추가되어 개정 내역을 시작할 수 있습니다.
git init --bare또한 저장소를 작성하지만 작업 디렉토리가 없습니다. 즉, 파일을 편집하거나 변경 사항을 커밋하고 해당 리포지토리에 새 파일을 추가 할 수 없습니다.
언제 --bare도움이 될 수 있습니까? 당신과 다른 몇 사람이 프로젝트에서 작업하고 git을 사용합니다. 일부 서버에서 프로젝트를 호스팅했습니다 ( amazon ec2). 각자는 자신의 컴퓨터를 가지고 있으며 코드를 푸시합니다 ec2. 실제로 어떤 것도 개발하지 않습니다 ec2(귀하의 기계를 사용함)-코드를 밀기 만하면됩니다. 따라서 귀하 ec2의 코드는 모든 코드의 저장 장치이며 모든 --bare기계없이 생성해야합니다 --bare(대부분 하나만, 다른 하나는 모든 것을 복제합니다). 워크 플로우는 다음과 같습니다.

Bare 이외의 저장소가 기본값입니다. 실행할 때 생성 git init되거나 bare서버에서 옵션 없이 복제 할 때 생성됩니다 .
이와 같은 저장소로 작업 할 때 저장소에있는 모든 파일을보고 편집 할 수 있습니다. 변경 사항을 커밋하여 저장소와 상호 작용할 때 Git은라는 숨겨진 디렉토리에 변경 사항을 저장합니다 .git.
git 서버가 있으면 파일의 작업 복사본이 필요하지 않습니다. 에 저장된 Git 데이터 만 있으면됩니다 .git. 베어 리포지토리는 .git파일을 수정하고 커밋하기위한 작업 영역이없는 디렉터리입니다.
서버에서 복제 할 때 Git은 .git작업 카피를 생성하기 위해 디렉토리에 필요한 모든 정보 를 가지고 있습니다.
--bare와 Working Tree 리포지토리의 또 다른 차이점은 첫 번째 경우 손실 된 커밋이 저장되지 않고 분기 트랙에 속하는 커밋 만 저장된다는 것 입니다. 반면, Working Tree는 모든 커밋을 영원히 유지합니다. 아래를 참조하십시오 ...
을 사용하여 첫 번째 저장소 (이름 : git-bare )를 만들었습니다 git init --bare. 서버입니다. 원격 저장소이기 때문에 원격 브랜치가없는 왼쪽에 있습니다.
첫 번째 저장소에서 두 번째 저장소 ( git-working-tree )를 만들었습니다 git clone. 그것은 오른쪽에 있습니다. 로컬 지점이 원격 지점에 연결되어 있습니다.
(텍스트 'first', 'second', 'third', 'fourth', 'alpha', 'beta'및 'delta'는 커밋 주석입니다. 'master'및 'greek'은 분기 이름입니다.)
이제 git-bare (command git push --delete origin greek:)와 git-working-tree (command :) 에서 로컬로 'greek'라는 브랜치를 삭제합니다 git branch -D greek. 트리 모양은 다음과 같습니다.
자식-베어 저장소는 분기 및 참조 된 모든 comits을 모두 삭제합니다. 그림에서 우리는이 때문에 나무가 줄어드는 것을 볼 수 있습니다.
반면에 일반적으로 사용되는 로컬 저장소와 동등한 git-working-tree 저장소는 커밋을 삭제하지 않으며 git checkout 7fa897b7명령으로 해시에서 직접 참조 할 수 있습니다 . 그렇기 때문에 트리에는 수정 된 구조가 없습니다.
요약 : 커밋은 작업 트리 리포지토리에서 삭제되지 않지만 베어 리포지토리 에서 삭제됩니다 .
실제로는 로컬 리포지토리에있는 서버에서 삭제 된 분기 만 복구 할 수 있습니다.
그러나 원격 브랜치를 삭제 한 후 베어 리포지토리 의 크기가 디스크 크기가 줄어들지 않는 것은 매우 이상합니다 . 즉, 파일은 여전히 어떻게 든 존재합니다. 더 이상 참조되지 않거나 참조 할 수없는 항목 (후자의 경우)을 삭제하여 저장소를 덤프하려면 다음 git gc --prune명령을 사용하십시오.