source

"git init"과 "git init --bare"의 차이점은 무엇입니까?

manysource 2023. 6. 29. 20:14

"git init"과 "git init --bare"의 차이점은 무엇입니까?

사이의 차이점은 무엇입니까?git init그리고.git init --bare나는 많은 블로그 게시물이 필요하다는 것을 발견했습니다.--bare그들의 Git 서버를 위해?

페이지에서 다음과 같이 표시되었습니다.

--bare

맨 리포지토리를 만듭니다.GIT_DIR 환경이 설정되지 않은 경우 현재 작업 디렉토리로 설정됩니다.

하지만 그것은 실제로 무엇을 의미할까요?다음이 필요합니까?--bareGit 서버 설정을 위해?

논베어 깃 레포

수 작업 디렉터리가 .git clone)을에 작성후디다포음있수확있다습니인할이 되어 있는 할 수 있습니다.git역사와 모든 깃 배관이 가는 폴더.당신은 그 수준에서 일합니다..git폴더가.

베어 깃 레포

.git clone --bare 할 수 작업할 수 있는 디렉토리가 없습니다. 디토리모이다포내다니용입함된음에제렉내용에 된 것이 ..git위의 경우에 폴더.

하나를 사용하는 이유와 다른 하나를 사용하는 이유

작업 디렉터리가 없는 Git 저장소의 필요성은 분기를 해당 디렉터리에 푸시할 수 있고 다른 사용자가 작업하는 내용을 관리하지 않는다는 점입니다.비어 있지 않은 리포지토리로 계속 밀어넣을 수 있지만, 해당 작업 디렉토리에서 다른 사용자가 작업 중인 분기를 이동할 수 있기 때문에 거부됩니다.

따라서 작업 폴더가 없는 프로젝트에서는 git가 저장하는 개체만 볼 수 있습니다.압축 및 직렬화되어 내용의 SHA1(해시)에 저장됩니다.기본 저장소에 개체를 가져오려면 다음 작업을 수행해야 합니다.git show그런 다음 보려는 개체의 sha1을 지정합니다.프로젝트와 같은 구조를 볼 수 없습니다.

맨 리포지토리는 일반적으로 모든 사용자가 작업을 이동하는 중앙 리포지토리입니다.실제 작업을 조작할 필요가 없습니다.이것은 여러 사람들 간의 노력을 동기화하는 방법입니다.프로젝트 파일을 직접 볼 수 없습니다.

프로젝트에서 작업하는 유일한 사용자이거나 "논리적으로 중앙" 저장소를 원하지 않거나 필요로 하지 않는 경우 맨 저장소가 필요하지 않을 수 있습니다.선호할 수 있습니다.git pull 경우 다른 리포지토리에서 검색합니다.이렇게 하면 Git가 베어가 아닌 리포지토리에 푸시할 때 발생하는 반대 의견을 피할 수 있습니다.

단답형

맨 저장소는 작업 복사본이 없는 깃 저장소이므로 .git의 내용은 해당 디렉터리의 최상위 수준입니다.

비어 있는 리포지토리를 사용하여 로컬에서 작업하고 비어 있는 리포지토리를 중앙 서버/허브로 사용하여 변경사항을 다른 사용자와 공유합니다.예를 들어 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'.

이 경고를 건너뛸 수 있습니다.그러나 권장되는 설정은 비베어 저장소를 사용하여 로컬로 작업하고, 비어 있는 저장소를 밀고 당길 허브 또는 중앙 서버로 사용하는 것입니다.

다른 개발자의 작업 복사본과 직접 작업을 공유하려는 경우 밀어넣기 대신 서로 다른 리포지토리에서 꺼낼 수 있습니다.

얼마 전에 이 질문을 읽었을 때, 모든 것이 저에게 혼란스러웠습니다.방금 git을 사용하기 시작했는데 작업 복사본이 있습니다(당시에는 아무런 의미가 없었습니다).저는 이것을 용어에 대해 전혀 알지 못한 채 기트를 시작한 그 남자의 관점에서 설명하려고 노력할 것입니다.

차이점의 좋은 예는 다음과 같습니다.

--bare저장 공간만 제공합니다(거기서는 개발할 수 없음). 없이.--bare그것은 당신이 그곳에서 개발할 수 있는 능력을 제공합니다. 그리고 저장 장소를 가지고 있습니다.

git init현재 디렉터리에서 Git 리포지토리를 만듭니다.내부에 .git 폴더를 추가하여 수정 내역을 시작할 수 있도록 합니다.

git init --bare또한 리포지토리를 만들지만 작업 디렉터리가 없습니다.즉, 해당 리포지토리에서 파일을 편집하거나 변경 내용을 커밋하거나 새 파일을 추가할 수 없습니다.

언제가 도움이 될까요?당신과 다른 몇 명의 남자들이 그 프로젝트를 진행하고 있고 깃을 사용하고 있습니다.일부 서버에서 프로젝트를 호스트했습니다(amazon ec2당신들은 각각 자신의 기계를 가지고 있고 당신들의 코드를 위에.ec2당신들 중 누구도 실제로는 아무것도 개발하지 않았습니다.ec2(당신은 당신의 기계를 사용합니다) - 당신은 당신의 코드를 누르기만 하면 됩니다.그래서 너의ec2이며 모든 코스대뿐일다이합같니다생야어되로 .--bare 그고리당모기계은들든의신▁your가 없는 모든 기계.--bare(아마도 하나만 복제하고 다른 하나는 모든 것을 복제할 것입니다.)워크플로우는 다음과 같습니다.

enter image description here

기본 Git 저장소는 사용자가 Git를 작업 디렉토리로 사용할 것으로 가정합니다.일반적으로 서버에 있을 때는 작업 디렉토리가 필요하지 않습니다.그냥 저장소.이 경우 다음을 사용해야 합니다.--bare선택.

비어 있는 리포지토리가 기본값입니다.은 실할때생기능다니입는되성을 실행할 때 입니다.git init할 때 수 있는 (" " " " " " " " " " ( " " " " " " " " " " " " " " " 없이 할 수 .bare서버에서 선택할 수 있습니다.

이와 같은 리포지토리로 작업하면 리포지토리에 있는 모든 파일을 보고 편집할 수 있습니다.를 들어때 사항을 라는 숨겨진 합니다..git.

Git 서버가 있는 경우 파일의 작업 복사본이 필요하지 않습니다.당이필것은단지저이다니데에 된 입니다..git 맨소는정히입니다..git파일을 수정하고 커밋하기 위한 작업 영역이 없는 디렉토리입니다.

할 때 를 서에서때 는에필모요있정다습에 합니다..git작업 복사본을 만들 디렉토리입니다.

--bare와 Working Tree 리포지토리의 또 다른 차이점은 첫 번째 경우 손실된 커밋은 저장되지 않고 분기 트랙에 속하는 커밋만 저장된다는 것입니다.반면에 작업 트리는 모든 커밋을 영구적으로 유지합니다.아래 참조...

첫 번째 저장소(이름: git-bare)를 만들었습니다.git init --bare서버니다입. 이것은원격 왼쪽에 있습니다. 여기에는 원격 저장소 자체이기 때문에 원격 분기가 없습니다.

두 번째 저장소(이름: git-working-tree)를 만들었습니다.git clone오른쪽에 있습니다.원격 분기에 연결된 로컬 분기가 있습니다.

('첫 번째', '두 번째', '세 번째', '네 번째', '알파', '베타', '델타' 텍스트가 커밋 코멘트입니다.'master'와 'greek'의 이름은 지점 이름입니다.

Local and remote repositories

이제 git-bare에서 'greek'라는 분기를 모두 삭제하겠습니다(명령:git push --delete origin greek) 및 local igit-working-tree(명령:git branch -D greek) 나무의 모양은 이렇습니다.

The git-bare repository deletes what is no longer referenced

깃베어 저장소는 분기와 참조된 모든 커밋을 모두 삭제합니다.사진에서 우리는 그 나무가 이러한 이유로 줄어든 것을 볼 수 있습니다.

반면에, 일반적으로 사용되는 로컬 저장소와 동일한 git-working-tree 저장소는 커밋을 삭제하지 않으며, 이제 다음을 사용하여 해시에 의해 직접 참조될 수 있습니다.git checkout 7fa897b7구조를 있지 않은 입니다.그것이 그것의 나무가 수정된 구조를 가지고 있지 않은 이유입니다.

요약:커밋은 작업 트리 리포지토리에서 삭제되지 않고 맨 리포지토리에서 삭제됩니다.

실제적으로 서버의 삭제된 분기는 로컬 리포지토리에 있는 경우에만 복구할 수 있습니다.

그러나 원격 분기를 삭제한 후에도 저장소의 크기가 디스크 크기가 줄지 않는 것은 매우 이상한 일입니다. 즉, 파일이 어떻게든 남아 있다는 것입니다.더 이상 참조되지 않는 항목 또는 절대 참조할 수 없는 항목을 삭제하여 저장소를 덤프하려면(후자의 경우)git gc --prune

언급URL : https://stackoverflow.com/questions/7861184/what-is-the-difference-between-git-init-and-git-init-bare