View
BackLink: Bare-Git Repository란?
References
- What do you use to manage dotfiles? - StreakyCobra on Feb 10, 2016, HackerNews
- The best way to store your dotfiles: A bare Git repository - Gabrielle Young
- Dotfiles - Atlassian Bitbucket Tutorials
- git checkout
기본적인 틀은 dotfiles의 변화를 기록하는 Bare-Git Repo를 $HOME/.cfg
라는 사이드 폴더에 생성하여 $HOME
을 Workspace로 삼는 것이다.
그리고 해당 Bare-Git Repo들에게만 작동하도록 특별히 지정한 git aliases
들을 설정하여 다른 로컬 git 파일들에서의 작업에 지장이 가지 않도록 Workspace Configuration을 해준다.
사실 Bare-Git Repo 보다는 이 Workspace Configuration이 중요하다.
실제로 Non-Bare Git Repo도 Workspace Configuration만 동일하게 설정한다면 Bare-Git Repo와 동일하게 작동함을 확인할 수 있다.
- dotfile들을 추적할 Git Repo를
$HOME
디렉토리의.cfg
라는 이름의 bare-git repo로 관리한다. - Git Repository의 Workspace 또는 Working Tree를 환경변수에 지정되어 있는
$HOME
디렉토리로 설정한다. - dotfile들을 본래의 위치를 유지한채로
git add
andgit commit
를 통해 Git Repository로 추적한다. - 만든 Git Repository를 Github에 Push하여 저장한다. → 이를 통해 dotfile들은 백업되며 언제든지 복제가 가능해진다.
- 이렇게 만들어진 Github의 레포지토리의 dotfile들을 언제든 다른 머신에서 clone 하여 사용할 수 있다.
결과적으로 이렇게 관리하는 dotfile들은 자기자신이 있어야 하는 위치에서 변하지 않고 자리를 유지할 수 있으며, 그 어떤 symlink 없이 관리가 가능하고 Git이라는 버전관리시스템의 모든 혜택을 받을 수 있다!
Overview of storing dotfiles in a Git Repository
- Storing your dotfiles using bare-git repository
git init --bare $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
config config --local status.showUntrackedFiles no
config add .vimrc
+config commit -m "add .vimrc"
+config push
- Installing
echo ".cfg" >> .gitignore
git clone --bare <remote-git-repo-url> $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
config checkout
config add .vimrc
+config commit -m "add .vimrc"
+config push
Line by line breakdown
Storing your dotfiles using bare-git repository
1. git init --bare $HOME/.cfg
$HOME
에 .cfg
라는 이름으로 dotfiles를 기록하는 Bare-Git Repo를 만든다.
2. alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
기본적으로 Git 명령어들을 실행하면 해당 명령어들이 실행되어 반영되는 곳은 레포지토리 내의 /.git
폴더에서 해석되어 실행된다. 이는 Git Program이 실제로 추적하고 관리하는 것은 .git
폴더이기 때문이다.
그리고 이러한 일반적인 상황에서 Git은 Workspace는 해당 레포지토리(디렉토리)로 인식한다.
/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME
에 주목하자./usr/bin/
경로에 위치한 git 프로그램을 실행하여 옵션으로 --git-dir=$HOME/.cfg/
과 --work-tree=$HOME
을 전달한다는 의미를 지니며, 옵션 --git-dir=$HOME
은 Git Repo를 $HOME/.cfg
디렉토리로 설정하고 --work-tree=$HOME
은 Workspace를 $HOME
디렉토리 전체로 지정한다는 의미를 지닌다.
따라서 /usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME {어떠한 Git 명령어}
의 의미는 $HOME/.cfg
를 Git Repo로 지정하고 $HOME
디렉토리 전체를 Workspace로 지정한 상태에서 어떠한 Git 명령어 ex) status, add, commit, push, pull ....etc 들을 실행하겠다는 의미이다.
명령어 alias
는 명령어의 별병을 지어주는 리눅스 명령어로, /usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME
이라는 긴 명령어를 config
라는 짧은 커스텀된 명령어로 줄여준다.
다만 .zshrc
나 .bashrc
와 같은 쉘 자체의 설정파일에 저장되지 않았기에 시스템을 재부팅할 때마다 위 명령어를 실행해줘야 하는 불편함이 따른다.
3. echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.zshrc
리눅스의 echo
명령어를 통해 해당 별칭 지정 명령어를 터미널 쉘 설정 파일에 저장한다. 이로써 재부팅할때마다 위의 2번 명령어를 실행할 필요가 없어진다.
4. config config --local status.showUntrackedFiles no
기본적으로 Git은 git status
명령어 사용 시 다음과 같이 Workspace 내에서 사용자가 레포지토리에 git add
를 통해 추적 리스트에 추가하지 않은 파일들도 보여준다.
이러한 파일들을 untracked files라고 부르며 현재 Workspace로 지정된 곳이 $HOME
디렉토리인 만큼 어마무시하게 많은 파일들이 뜸을 볼 수 있다.
이러한 현상을 방지하기 위해 이 명령어는 해당 Git Repo의 설정을 사용자가 실제로 Workspace에서 추적하게끔 git add
명령어로 추가한 파일들만 git status
명령어로 볼 수 있게 바꿔준다.
5. config add .vimrc
+ config commit -m "add .vimrc"
+ config push
이제 환경설정은 모두 완료되었다.
앞서 alias
명령어로 지정한 config
명령어를 통상적으로 쓰는 git
대신에 활용하여 관리가 필요한 dotfiles들의 변화를 기록하고 github에서 이를 유지할 수 있다!
Installing
1. echo ".cfg" >> .gitignore
앞으로 Git Repo로 사용할 .cfg
가 자기자신을 추적하면 오류가 발생하기에 이를 .gitignore
에 넣어줌으로써 방지한다.
2. git clone --bare <remote-git-repo-url> $HOME/.cfg
이제 자신의 Github에서 원하는 레포지토리를 Bare-Git 레포지토리로 clone 해준다.
3. alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
앞서 했던 alias
를 설정해준다.
여기서 echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
를 하지 않고 1회성 별칭지정을 하는 이유는 앞으로 가져올 .basrc .zshrc
등등과 같은 터미널 쉘 설정파일들도 있다고 가정했기 때문이다.
만약 없다면 설정파일에 적어두면 된다.
4. config config --local status.showUntrackedFiles no
마찬가지로 config status
명령어 사용 시 불필요하게 많은 파일들을 보지 않기 위한 설정을 해준다.
5. config checkout
git checkout
명령어는 독특하게도 하나의 명령어이지만 여러가지 기능을 지닌다.
그중 하나는 바로 Working Tree 파일들을 복원하는 것으로, 이번에 실행하는 config checkout
명령어는 가장 Git에 기록되어 있는 가장 최근의 Workspace 상태로 Workspace를 복원하는 역할을 한다.
즉 clone 하여 만든 Bare-Git Repo인 .cfg
에 기록된 dotfiles들을 실제로 Workspace로 지정된 $HOME
디렉토리에 생성하는 역할을 한다.
주의
다만 이렇게 바로 checkout하여 복원하면 에러메시지가 발생할 수 있다.
Github에 보관되어 있는 dotfiles들 중에 현재 로컬에 존재하는 dotfile이 있을 수도 있기 때문이다.
이 dotfiles들을 찾아서 백업해두거나 제거한 뒤에 다시 명령어를 실행하면 원활하게 실행이 된다.
6. config add .vimrc
+ config commit -m "add .vimrc"
+ config push
이제 $HOME
디렉토리에서 원하는 dotfile들을 GIt에 추가하고 커밋하면서 관리할 수 있다!
아래는 실제로 나의 VIM 설정을 적용한 모습이다.
개인적으로 배경색은 터미널의 설정을 이용하기에 Ubuntu Bash 쉘의 기본 색이 적용되어있다.
'Tools > Git' 카테고리의 다른 글
Bare-Git Repository란? (1) | 2022.11.23 |
---|