RunFridge's Blog

Dotfiles

개요

새 노트북을 받거나, 서버를 새로 세팅하거나, OS를 밀고 재설치할 때마다 .zshrc를 다시 쓰고, Neovim 플러그인을 다시 깔고, tmux 키바인딩을 기억에 의존해 복원하는 과정을 반복했다.

그래서 2024년 2월부터 dotfiles 저장소를 만들어 개발 환경 설정 전체를 git으로 관리하기 시작했다. 이 글에서는 380여 개의 커밋을 거치며 정리된 현재의 구조와, 그 과정에서 배운 것들을 정리해보았다.

GNU Stow

닷파일 관리 방법은 여러 가지가 있다. bare git repo 방식, chezmoi 같은 전용 도구, 직접 짠 심볼릭 링크 스크립트 등. 그중 가장 단순한 GNU Stow를 선택했다.

Stow 공식 문서의 설명이다:

GNU Stow is a symlink farm manager which takes distinct packages of software and/or data located in separate directories on the filesystem, and makes them appear to be installed in the same place.

GNU Stow는 심볼릭 링크 팜 관리자로, 파일시스템의 서로 다른 디렉토리에 위치한 소프트웨어/데이터 패키지들이 마치 한 곳에 설치된 것처럼 보이게 해준다.

개념은 간단하다. 저장소 안에 홈 디렉토리 구조를 그대로 흉내 낸 "패키지" 디렉토리를 만들면, stow 커맨드 한 번으로 심볼릭 링크를 걸어준다.

dotfiles/
├── zsh/
│   └── .zshrc          →  ~/.zshrc
├── tmux/
│   └── .tmux.conf      →  ~/.tmux.conf
└── nvim/
    └── .config/nvim/   →  ~/.config/nvim/
$ cd ~/dotfiles
$ stow zsh tmux nvim

이게 전부다. 설정 파일은 전부 git으로 버전 관리되고, 홈 디렉토리에는 링크만 존재한다. 설정을 수정하면 바로 저장소에 반영되기 때문에 git diff로 어떤 변경이 있었는지 항상 확인할 수 있다.

어떤 설정을 담았나

처음엔 vim과 git 설정 정도로 시작했지만, 쓰다 보니 개발 환경 전체가 들어오게 되었다.

한글 입력기(kime) 설정까지 저장소에 넣어두니, 새 리눅스 머신에서도 한영 전환이 바로 예전처럼 동작한다. 이런 사소한 것들이 쌓여서 "새 머신 세팅 반나절"이 "10분"으로 줄어든다.

부트스트랩 스크립트

저장소를 클론했다고 끝이 아니다. stow도 깔아야 하고, 서브모듈도 받아야 하고, fzf나 zoxide 같은 도구들도 설치해야 한다. 그래서 400줄 남짓한 bootstrap.sh를 만들었다.

$ git clone https://github.com/hwhang0917/dotfiles.git ~/dotfiles
$ cd ~/dotfiles
$ ./bootstrap.sh

스크립트가 하는 일은 다음과 같다:

  1. 필수 의존성(git, stow, curl) 확인 및 설치
  2. 플랫폼 감지 — Arch 계열은 pacman, RHEL 계열은 dnf, Debian 계열은 apt, macOS는 brew
  3. git 서브모듈 초기화
  4. 선택 도구 설치 — fzf, zoxide, eza, bat, starship, fnm 중 원하는 것만 선택
  5. 플랫폼에 맞는 stow 패키지 선택 및 링크 — Linux면 hypr/sway가 기본 선택되고, WSL이면 GUI 관련 패키지는 제외되는 식

인터랙티브 프롬프트에는 gum을 사용했다. 설치되어 있으면 체크박스 UI가 뜨고, 없으면 기본 read로 폴백한다. Windows는 별도의 bootstrap.ps1winget으로 같은 역할을 한다.

배운 것들

처음부터 완벽하게 만들려 하지 말 것

첫 커밋은 정말 단출했다. 380개의 커밋 히스토리가 말해주듯, 닷파일 저장소는 한 번에 완성하는 프로젝트가 아니라 계속 가꾸는 정원에 가깝다. 설정을 하나 바꿀 때마다 커밋하면 된다.

플랫폼 분기는 필요해질 때 추가할 것

처음엔 Arch 리눅스만 지원했지만, 회사 윈도우 노트북이 생기면서 자연스럽게 플랫폼 감지 로직이 추가되었다. 미리 고민할 필요가 없었다.

머신별로 달라야 하는 값은 저장소에 넣지 말 것

git 이메일 같은 로컬 설정은 별도 파일로 분리하고, 저장소의 설정에서 include 하는 방식을 사용한다.

# git/.gitconfig
[include]
    path = ~/.gitconfig.local

부트스트랩 스크립트가 이 파일이 없으면 만들라고 알려준다.

커밋하면 안 되는 값은 git filter로 걸러낼 것

예를 들어 Claude Code 설정 파일에는 세션마다 바뀌는 모델 값이 들어가는데, .gitattributes에 clean filter를 등록해서 커밋 시 자동으로 정규화되도록 했다.

claude/.claude/settings.json filter=claude-model

"이거 또 diff에 떴네" 하는 노이즈가 사라진다.

마치며

닷파일 저장소의 진짜 가치는 백업이 아니라 재현성이다. 어떤 머신이든 클론 -> 부트스트랩 한 번이면 손에 익은 환경이 그대로 복원된다는 확신. 그리고 부수적으로, 개발 환경의 변천사가 git 히스토리로 남는다는 점도 꽤 즐겁다. 2년 전의 내가 어떤 도구를 썼는지 git log로 돌아볼 수 있으니까.

아직 닷파일을 관리하지 않고 있다면, 오늘 .zshrc 하나로 시작해보자!