nuc이나 pi, EC2와 같은 VM 등 사용하는 컴퓨터 pc가 늘어나고, local setting(dotfile)이 점점 길어짐에 따라, 이 dotfile들을 효과적으로 관리하고 간편하게 사용할 수 있는 방법이 필요해졌다. 폴더를 만들어 각각의 dotfile들을 저장하고 스크립트를 써서 각각의 dofile의 symlink를 홈디렉토리에 만드는 방법도 있지만, 나는 Bare 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을 편하게 관리할 수 있다.
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
config status
config add .vimrc
config commit -m "add vimrc"
config push
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
이로써, dotfile만의 git명령어를 config라는 명령어를 통해 쉽게 dotfile들을 관리할 수 있다. 홈디렉토리에 git init을 해서 git 명령어를 통해 dotfile들을 관리할 수도 있겠지만, 실수를 유발할 확률이 높다. 그렇다고 전체파일을 .gitignore시키고 git add -f file 를 통해서 관리하는 것도 마음에 들진 않았다.
좋은 정보를 공유해준 StreakyCobra(https://news.ycombinator.com/item?id=11071754)에 감사를 표한다.
와! 저도 같은 방법으로 관리하고 있어요. 잘 정리해주셨네요! 감사합니다 ㅎㅎ