View
References
- What is a bare Git repo and why you need them
- bare repos in git - GeekforGeeks
- What is a bare git repository? - Jon Saints
What is a Bare Git Repository?
git init
은 원하는 디렉토리 내에서 git을 활성화할 때 쓰는 명령어다.
이를 실행하면 Git 프로그램에서 주시하는 해당 디렉토리에 대한 모든 Git 관련 데이터를 저장하고 관리하는 .git 이라는 디렉토리가 생성된다.
통상적으로 사람들이 git init
명령어를 통해 어떤 디렉토리에서 Git을 활성화하거나 Github에서 git clone
명령어로 레포지토리를 어떤 디렉토리로 clone 할 때 해당 디렉토리를 'git repo'라고 부른다.
이 용어는 다소 틀린 감이 없잖아 있는데 이는 사실 정확하게 보면 cloning을 통해 구축된 디렉토리 내부는 working space(or Working Directory) 와 git repo 로 구분되기 때문이다.
이에 대해 알아보자.
Workspace (Working Directory)
File tree representation of the repo at a given commit hash.
=> git commit hash에 저장된 가장 최근의 기록을 가지고 File Tree 형태로 구현된 형태.
이름에서 알 수 있듯이 '작업'을 위한 공간이며, 실제로 있는 파일들을 수정, 추가, 삭제 및 커밋하여 나의 변화를 기록할 수 있는 공간이다.
Git Repo
Contents of the actual Git Repository which contains everything Git Program needs to maintain the repository. A.K.A .git directory
예시를 위해 gitTest라는 디렉토리를 생성하고 github에서 무작위 디렉토리를 가져와 clone 해보았다.
아래는 위에서 정의된 Workspace를 보여준다.
해당 Workspace는 사실 git branch main의 commit hash 중 아래에서 하이라이팅된 가장 최근의 commit hash를 실제 디렉토리 형태로 구현한 것에 불과하다.
진정한 의미의 Git Repository란 사실 터미널에서 ls -al
명령어로 숨김파일까지 다 보였을때 나오는 .git 디렉토리이다.
위에서 Workspace와 Git Repo의 차이에 대해 어렴풋이 알았으니 이제 Bare-Git Repository에 대해 알아보자.
용어에서 알 수 있듯이 Bare-Git Repo란 위에서 관찰했던 Workspace와 Git Repo 중, 순수한 Git Repo를 의미한다.git clone --bare {url} {filename}
명령어를 통해 Bare-Git Repo를 생성할 수 있으며 그 내용물은 아래와 같다.
자세히 관찰해보면 몇가지 내용물들이 빠진 채로 생성됨을 알 수 있다. (이유는 아직 못찾음)
- index
- logs
- refs
또한 git status, git add, git checkout
등등의 평소에 Git에서 쓰던 명령어들이 안먹히는 것을 확인할 수 있는데 이는 해당 디렉토리가 Workspace가 아니기 때문이다.
사실 이 명령어들뿐 아니라 git commit
을 제외한 대부분의 명령어들이 먹히지 않는다.
그렇다면 일견 보기에 아무런 쓸모없어 보이는 디렉토리는 어디에 써먹는 것인가?
The point of bare-git repo is that you can't do anything with it.
The reason the bare-git repo exists is that now this can be used by another repo/workspace to actually push, pull, clone from this.
=> 이렇게 만들어진 Bare-Git Repo는 다른 디렉토리/Workspace에서 이 Bare-Git Repo를 push, pull, clone 하는 데 사용할 수 있으며, 이는 일반적인 git clone, git init
으로 만들어지는 Repo들은 할 수 없는 기능이다.
앞서 만들었던 baekjoon_nonbare를 지우고 Bare-Git Repo인 baekjoon_bare를 clone하여 다시 baekjoon_nonbare 이름으로 생성하여 보았다.
clone된 baekjoon_nonbare 디렉토리 내부를 보니 Workspace로 생성되었음을 확인할 수 있다. 또한 git remote -v
로 확인한 원격저장소는 Bare-Git Repo임을 볼 수 있다.
새로운 new.txt라는 파일을 만들어 baekjoon_nonbare 디렉토리에서 git add, git commit, git push
를 해보면 정상적으로 push가 되어 baekjoon_bare git log
에 기록됨을 볼 수 있다.
Bare-Git Repo? Github?
지금까지 했던 내용을 정리해보면, 일반적으로 우리가 Git Repository라고 부르던 것은 사실 Workspace와 .git 디렉토리에 저장된 데이터(.git directory === Git Repo)로 나뉜다는 것을 알았다.
Workspace를 제외한 나머지, Git Program에서 버전을 관리하기 위한 데이터들만을 가지고 만들어진 디렉토리를 Bare-Git Repository라고 부르며 이렇게 만들어진 레포지토리는 특이하게도 그 자체로는 아무런 조작을 가할 수 없으며 로컬에 저장되어 있음에도 불구하고 git clone
이 가능하여 원격저장소로 기능할 수 있음을 확인할 수 있었다.
Bare-Git Repository의 핵심은 원격저장소로 기능이 가능하다는 점이다.
이는 Bare-Git Repo가 '공유'의 공간으로 기능함을 의미한다.
여러 개발자들이 협업하는 프로젝트에서 모든 변경점들이 반영되어 기록되는 중앙화된 공간이 필요하고, 해당 프로젝트의 개발자들이 모두 접근 가능한 저장소가 있다면
사실상 Github와 기능이 유사하며 Localized된 Github라고 간단하게 생각할 수도 있을 것 같다.
Github가 있는데 이런 기능이 왜 필요하냐는 생각이 들 수도 있지만 이는 애초에 잘못된 의문이다.
Github보다 Git이 먼저 나왔기 때문이다. Git이후에 나온 클라우드 서비스가 Github이기 때문에 이러한 기능이 있어야함이 옳다.
'Tools > Git' 카테고리의 다른 글
Bare-Git Repository를 이용한 dotfiles Migration (0) | 2022.11.23 |
---|