얼마전에 Git 예제를 준비하느라고 로컬에서 Git 저장소를 생성해서 예제 시나리오를 만들어야 했다. 이번에는 실제 시나리오처럼 원격저장소를 두고 clone을 받아서 커밋을 주고 받는 과정을 만들어야 했는데 Github같은 서비스에 저장소를 만들어서 할 수도 있지만 네트워크 상황도 고려해야 하고 불필요한 저장소를 Github같은 곳에 만드는 것도 큰 의미는 없다. Git은 말 그대로 분산저장소이므로 파일시스템에 접근만 가능하면 원격저장소의 역할을 할 수 있어서 굳이 원격으로 접속해야 하는 서비스에 저장소를 만들 필요가 없다.
로컬저장소에서 Clone 하기
origin이라는 폴더에서 git init
으로 저장소를 생성했다고 하면 git clone ./origin fork
로 클론할 수 있다. 여기서 origin
은 폴더명이고 fork
는 클론받을 이름이다. git clone ./origin
라고만 하면 origin
이라는 이름으로 클론을 받는데 해당 이름이 있으므로 겹치지 않도록 이름을 지정해 주었다.
이렇게 포크받은 저장소는 Github같은 곳에서 클론받은 것과 완전히 동일하다. 다음 화면에서 보듯이 remote의 origin이 origin폴더를 바라보고 있는 것을 할 수 있다.
하지만 여기서 새로운 커밋을 하고 푸시를 하면 푸시되지 않고 오류가 발생한다.
receive.denyCurrentBranch
이 문제는 여기서 생성한 git 저장소가 bare 저장소가 아니기 때문에 발생한 오류이다. 우리가 일반적으로 보는 저장소는 non-bare 저장소인데 파일 수정들의 작업을 하는 워킹 디렉토리가 있는 저장소가 non-bare 저장소이고 bare 저장소는 워킹디렉토리 없이 변경사항만 관리하게 된다. non-bare 저장소에서(여기서는 origin 폴더) 이 문제를 해결하려면 git config receive.denyCurrentBranch ignore
을 실행해서 현재 브랜치에서 푸시를 받도록 설정하면 정상적으로 푸시를 할 수 있다.
bare 저장소 만들기
아니면 처음에 origin 저장소를 생성할 때 bare 저장소로 생성하면 되는데 git init
대신 git init --bare
로 옵션을 붙혀주면 해당 저장소는 bare 저장소로 생성된다. 당연히 bare 저장소이므로 이 저장소에서는 워킹디렉토리가 존재하지 않는다.
그래서 non-bare 저장소처럼 폴더 루트가 워킹디렉토리가 있고 .git
폴더안에 Git 관련 파일들이 있는 대신 폴더 루트에 Git 관련파일들이 존재하게 된다.
Comments