“git --bare init”저장소를 어떻게 사용합니까?


320

중앙 Git 리포지토리를 만들어야하지만 조금 혼란 스럽습니다 ...

다음을 사용하여 베어 리포지토리 (git 서버, 머신 2)를 만들었습니다.

$ mkdir test_repo
$ git --bare init

이제 로컬 리포지토리 (컴퓨터 1)에서 베어 리포지토리 (컴퓨터 2)로 파일을 푸시해야합니다. SSH로 시스템 2에 액세스 할 수 있습니다. 문제는 베어 저장소의 개념을 이해하지 못한다고 생각합니다.

베어 저장소에 코드를 저장하는 올바른 방법은 무엇입니까? 로컬 저장소에서 베어 저장소로 변경 사항을 푸시하려면 어떻게해야합니까?

베어 리포지토리를 갖는 중앙 리포지토리를 갖는 올바른 방법입니까?

나는이 주제와 약간 혼동된다. 이것에 대한 실마리를주세요.

답변:


391

먼저 확인하기 위해을 실행하기 전에 만든 디렉토리로 변경해야합니다 git init --bare. 또한 베어 리포지토리에 확장을 제공하는 것이 일반적 .git입니다. 그래서 당신은 할 수 있습니다

git init --bare test_repo.git

Git 버전 <1.8의 경우

mkdir test_repo.git
cd test_repo.git
git --bare init

이후의 질문에 답하기 위해 베어 리포지토리 (정의에 따라)에는 작업 트리가 첨부되어 있지 않으므로 일반적인 비 베어 리포지토리 (예 : with git add <file>및 후속) 에서처럼 파일을 쉽게 추가 할 수 없습니다 git commit. )

거의 항상 git push다른 리포지토리에서를 사용하여 베어 리포지토리를 업데이트 합니다.

이 경우 사람들이 먼저 저장소로 푸시하도록 허용해야합니다. 때 내부 test_repo.git수행

git config receive.denyCurrentBranch ignore

커뮤니티 편집

git init --bare --shared=group

prasanthv의 의견에 따르면 개인 주택 프로젝트가 아닌 직장 에서이 작업을 수행하는 경우 원하는 것입니다.


7
다른 사람이이 리포지토리에 푸시 할 계획이라면 --shared옵션을 추가 할 수도 있습니다 init. 자동으로 저장소에 그룹 쓰기 권한을 추가합니다.- link
prasanthv

17
git --bare init test_repo.git 적어도 내 현재 git 버전 (1.8.2.2)과 함께
Fran Marzoa

1
유용한 당신은 베어와 비 베어의 repos 사이의 차이를 알고 싶다면 stackoverflow.com/questions/7861184/...
인 Guille 아코 스타

작동중인 트리가 없다면 git은 어떻게 물건을 찾는가? 나는 git 객체 저장소에 작업 트리가 있다고 생각했고, 이것이 스테이징 SHA가 가리키고 커밋하는 것입니다.
akantoword

@akantoword : git은 커밋 및 분기에 대한 모든 정보를 어딘가에 저장합니다. 커밋은 아마도 이전 버전의 파일과 새 버전 사이의 차이점 일 것입니다. 작업 트리는 특정 시간에 실제 내용의 스냅 샷일뿐입니다. 어쨌든 작업 트리를 사용하면 커밋과 분기 사이를왔다 갔다 할 수 있습니다. 원하는 경우 다른 작업 트리에서 체크 아웃 할 수도 있습니다.
user276648

246

여기에 (같은 질문으로) 도착한 후에는 아무것도 사용하지 않고 완전히 사용할 수있는 원격 (맨손) 저장소로 이동하는 데 필요한 모든 단계를 실제로 설명하지 않기 때문에이 답변을 추가하고 있습니다.

참고 :이 예제는 베어 리포지토리의 위치에 로컬 경로를 사용하지만 OP로 표시된 SSH와 같은 다른 git 프로토콜은 정상적으로 작동합니다.

git에 익숙하지 않은 사람들을 위해 메모를 추가하려고했습니다.

1. 베어 리포지토리 초기화 ...

> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/

이것은 폴더 (repo.git)를 생성하고 git repo를 나타내는 git 파일로 폴더를 채 웁니다. 서있는 것처럼,이 레포는 쓸모가 없습니다. 커밋이없고 더 중요하게 는 가지가 없습니다 . 이 저장소를 복제 할 수는 있지만 끌어낼 수는 없습니다.

다음으로 작업 폴더를 만들어야합니다. 기존 파일이 있는지 여부에 따라이 작업을 수행하는 몇 가지 방법이 있습니다.

2a. 빈 저장소를 복제하여 새 작업 폴더 (기존 파일 없음)를 만듭니다.

git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.

이 명령은 /path/to/work존재하지 않거나 빈 폴더 인 경우에만 작동 합니다. 경고에 유의하십시오.이 단계에서는 여전히 유용한 정보가 없습니다. 당신이 cd /path/to/work실행 하면 다음 과 git status같은 것을 얻을 수 있습니다 :

On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

그러나 이것은 거짓말입니다. 당신은 실제로 분기에 있지 않습니다 master( git branch아무것도 반환하지 않기 때문에 ). 지금까지는 커밋이 없습니다.

다음으로 작업 폴더에 일부 파일을 복사 / 이동 / 만들고 git에 추가하고 첫 번째 커밋을 만듭니다.

> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email adelphus@example.com
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

git config당신은 이미 당신이 자식에게하지 않은 경우 명령에만 필요합니다. 지금 실행하는 경우주의 git branch, 당신은 이제 볼 수 있습니다 master목록에 지점을. 이제 실행하십시오 git status:

On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

nothing to commit, working directory clean

이것은 또한 오해의 소지가 있습니다. 업스트림이 "사라지지"않았습니다 git branch --unset-upstream. 아직 생성되지 않았 으므로 도움이되지 않습니다. 그러나 이제는 첫 번째 커밋이 완료되었으므로 맨손으로 리포지토리에서 푸시하고 마스터 할 수 있습니다.

> git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master

이 시점에서 마스터 브랜치의 다른 곳에서 복제 할 수있는 완전 기능적인 베어 리포지토리와 끌어 올릴 수있는 로컬 작업 복사본이 있습니다.

> git pull
Already up-to-date.
> git push origin master
Everything up-to-date

2b. 기존 파일에서 작업 폴더 만들기 파일 이 들어있는 폴더가 이미있는 경우 (복제 할 수 없음) 새 자식 저장소를 초기화하고 첫 번째 커밋을 추가 한 다음 나중에 해당 저장소에 연결할 수 있습니다.

> cd /path/to/work_with_stuff
> git init 
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"

[master (root-commit) 614ab02] added stuff
 20 files changed, 1431 insertions(+)
 create mode 100644 stuff.txt
...

이 시점에서 우리는 첫 번째 커밋과 로컬 마스터 브랜치를 가지고 있으며, 원격 마스터 업스트림 브랜치로 전환해야합니다.

> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

-ugit 푸시 의 플래그가 (새로운) 추적 된 업스트림 브랜치를 설정하도록합니다. 이전과 마찬가지로 이제 마스터 브랜치의 다른 곳에서 복제 할 수있는 완전히 작동하는 베어 리포지토리와 끌어 올릴 수있는 로컬 작업 복사본이 있습니다.

이 모든 것이 어떤 사람들에게는 명백해 보일지 모르지만 git은 최선을 다해 혼란스러워합니다 (오류 및 상태 메시지는 실제로 약간의 재 작업이 필요합니다)-희망이 있으면 다른 사람들을 도울 것입니다.


4
흥미 롭군 내 대답보다 확실히 더 자세합니다. +1
VonC

13
이 답변은 내 문제를 해결하고 허용되는 답변이어야하며 점점 더 많은 사람들이 투표 할 수 있기를 바랍니다.
inix

11
다음과 같은 답변에 대해 비용을 청구하셔야합니다
Arthur Tarasov

2
새로운 git 사용자 로서이 답변은 저에게 매우 도움이되었습니다.
sidewinderguy

1
이것은 훌륭한 답변입니다. 우리 유닛을 많이 도울 것입니다.
wobsoriano

33

질문에 하나씩 답하기 :

베어 리포지토리는 작업 트리없는 저장소 입니다 . 그것은 전체 내용이 .git디렉토리에 있는 것을 의미합니다 .

로컬 클론에서 commit저장소 push를 사용하여 저장소를 베어 낼 수만 있습니다 . 작업 트리가 없으므로 파일을 수정하거나 변경하지 않습니다.

중앙 저장소가 유일한 방법은 bare저장소 를 갖는 것 입니다.


22

git에게 디렉토리를 만들도록 요청할 수도 있습니다.

git init --bare test_repo.git

20

일반적인 방법은 중앙 저장소를 기본 저장소로 사용하는 것입니다.

SVN 배경이있는 경우 SVN 리포지토리를 Git 베어 리포지토리와 연결할 수 있습니다. 원래 형식의 저장소에 파일이 없습니다. 로컬 리포지토리에는 "코드"를 구성하는 파일이 추가됩니다.

로컬 리포지토리에서 Bare Repo에 리모컨을 추가하고 "코드"를 푸시해야합니다.

다음과 같습니다.

git remote add central <url> # url will be ssh based for you
git push --all central

를 사용하면 git remote add central <url>SSH의 경우 경로도 포함됩니까? 예git remote add central ssh://user@server/home/user/repo.git
예 Barry

17

이것으로 충분합니다 :

git remote add origin <url-of-bare-repo>
git push --all origin

자세한 내용은 " GIT : 베어 리포지토리를 어떻게 업데이트합니까? "를 참조하십시오.
노트:

  • originBare Repo Remote Reference에 ' '와 다른 이름을 사용할 수 있습니다 .
  • 태그가 밀리지 않으므로 별도의 태그가 필요 git push --tags origin합니다.

5

푸시 한 코드가 실제로 커밋되었는지 확인하는 것이 좋습니다.

--relative 옵션을 사용하여 경로를 명시 적으로 설정하면 Bare 저장소에 대한 변경 사항 로그를 얻을 수 있습니다.

$ cd test_repo
$ git log --relative=/

이것은 일반적인 git repo 인 것처럼 커밋 된 변경 사항을 보여줍니다.


5

Mark Longair & Roboprog의 답변을 바탕으로 :

자식 버전이 1.8 이상인 경우

git init --bare --shared=group .git
git config receive.denyCurrentBranch ignore

또는 :

자식 버전이 1.8 미만인 경우

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore

그 설정 명령 : 방금 만든 .git 디렉토리에 어떻게 적용됩니까?
GreenAsJade

질문에 대해 잘 모르겠습니다. 더 정확할 수 있습니까? git 저장소가 초기화되었으므로 'git config'명령을 사용하여 원하는만큼 구성 할 수 있습니다.
Jack '

@GreenAsJade 그것은 여전히 ​​git 저장소의 폴더 안에 있기 때문에 적용됩니다 (git 설정의 기본값은 --local 옵션과 같습니다).
BlueCoder

2

--bare 플래그는 작업 디렉토리가없는 저장소를 작성합니다. Bare 저장소는 중앙 저장소이며 병합 오류를 피하기 위해 여기에서 코드를 편집 (저장) 할 수 없습니다.

예를 들어 로컬 리포지토리 (컴퓨터 1)에 파일을 추가하고 베어 리포지토리에 파일을 푸시하면 베어 리포지토리에서 파일이 항상 '비어 있기'때문에 파일을 볼 수 없습니다. 그러나 실제로 저장소에 무언가를 푸시하면 서버 (시스템 2)의 다른 저장소를 복제하여 명시 적으로 볼 수 있습니다.

머신 1의 로컬 리포지토리와 머신 2의 '복사'리포지토리는 모두 베어지지 않습니다. 베어 리포지토리와 비 베어 리포지토리 간의 관계

블로그가 이해하는 데 도움이됩니다. https://www.atlassian.com/git/tutorials/setting-up-a-repository


0

다음 명령을 실행하여 로컬 저장소를 초기화 할 수 있습니다

mkdir newProject
cd newProject
touch .gitignore
git init
git add .
git commit -m "Initial Commit"
git remote add origin user@host:~/path_on_server/newProject.git
git push origin master

로컬 저장소에서 프로젝트를 작업하고 서버를 중앙 저장소로 사용해야합니다.

이 기사를 따라 Git 리포지토리 생성 및 유지 관리의 모든 측면을 설명 할 수도 있습니다. 초보자를위한 힘내

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