dotfile을 편하게 관리하는 방법(with Bare Git repository)

wannte·2020년 4월 21일
2

nuc이나 pi, EC2와 같은 VM 등 사용하는 컴퓨터 pc가 늘어나고, local setting(dotfile)이 점점 길어짐에 따라, 이 dotfile들을 효과적으로 관리하고 간편하게 사용할 수 있는 방법이 필요해졌다. 폴더를 만들어 각각의 dotfile들을 저장하고 스크립트를 써서 각각의 dofile의 symlink를 홈디렉토리에 만드는 방법도 있지만, 나는 Bare git repository를 이용하여 이를 보다 깔끔하게? 관리할 수 있었다. 이를 이해하기에 앞서 git repository대해서 간단한 이해가 필요하다.

Git repository


말그대로 working directory는 내가 지금 작업을 하는 공간을 말한다. 이 directory 안의 파일들 중에 repository에 올려 따로 저장하고 싶은 경우, 우선 git add를 해서 staging area로 올리고, 메세지와 함께 커밋을 하면 그 파일의 스냅샷이 repository에 저장이 된다.(.git/ 폴더에 그 정보들이 저장된며, 그 파일들 각각은 track되어진다) 이를 github에 push를 하게 되면, 그 .git에 저장된 커밋된 파일의 스냅샷들이 github로 업로드되는것이다.
git checkout 명령어는 현재 repository의 있는 파일들을 working directory로 업데이트를 해준다.
git clone 명령어를 실행하게되면, 그 repository의 스냅샷에 해당하는 working directory를 자동적으로 생성해준다. 이를 통해 파일을 바로 사용하거나, 작업을 할 수 있다.

git clone은 --bare라는 옵션을 제공하는데, 이 경우에는 working directory가 아닌 repository만을 클론해 온다. 이 때, work-tree, 즉 working directory를 $HOME으로 설정하여 dotfile을 편하게 관리할 수 있다.

설정 방법

push to github

git init --bare $HOME/.myconf
alias config='/usr/bin/git --git-dir=$HOME/.myconf/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.myconf/ --work-tree=$HOME'" >> $HOME/.bashrc
  • ~/.myconf bare repository를 생성하며, 이는 .git 폴더와 같은 역할을 한다.
  • --git-dir(reposiory)를 ~/.myconf, work-tree를 $HOME 으로 하는 git 명령어를 기존의 git 처럼 사용하게 된다.
  • Track하지 않는 파일들, 즉 repository에 commit 되지 않은 파일들을 보이지 않게 설정한다.
  • config라는 명령어를 계속 사용하기에 이를 ~/.bashrc 에 추가해준다.
config status
config add .vimrc
config commit -m "add vimrc"
config push
  • 현재 tracked된 파일이 없어서 아무 파일도 나오진 않는다. 하지만, 이미 vimrc가 commit 된 상태라면, modified인 상태로 나온다.
  • git과 동일하게 add, commit, push 명령어를 사용하면 된다.

clone to new box

git clone --bare <git-repo-url> $HOME/.myconf
alias config='/usr/bin/git --git-dir=$HOME/.myconf --work-tree=$HOME'
config checkout
config config --local status.showUntrackedFiles no
  • git clone --bare를 이용해 repository 만 ~/.myconf로 clone 해온다.
  • 위에서와 마찬가지로, --git-dir=~/.myconf와 --work-tree=$HOME을 사용하는 config로 alias설정을 해준다.
  • config checkout을 해서 repository에 저장된 스냅샷들을 working directory에 업데이트해준다. 이때, box에 기존에 있던 파일들과 충돌이 나는 경우에는 오류를 뿜는데, 지워주거나 따로 backup폴더에 옮겨주고 다시 checkout을 진행해주면 된다.
  • 위와 마찬가지로 Untrackedfile들은 보여주지 않게 설정을 한다.

이로써, dotfile만의 git명령어를 config라는 명령어를 통해 쉽게 dotfile들을 관리할 수 있다. 홈디렉토리에 git init을 해서 git 명령어를 통해 dotfile들을 관리할 수도 있겠지만, 실수를 유발할 확률이 높다. 그렇다고 전체파일을 .gitignore시키고 git add -f file 를 통해서 관리하는 것도 마음에 들진 않았다.
좋은 정보를 공유해준 StreakyCobra(https://news.ycombinator.com/item?id=11071754)에 감사를 표한다.

profile
The Process

2개의 댓글

comment-user-thumbnail
2020년 4월 26일

와! 저도 같은 방법으로 관리하고 있어요. 잘 정리해주셨네요! 감사합니다 ㅎㅎ

답글 달기
comment-user-thumbnail
2020년 10월 20일

잘 정리해 주셔서 덕분에 편리해 졌습니다. 감사합니다.

답글 달기