
Mỗi developer đều có dotfiles — tập tin cấu hình ẩn (~/.bashrc, ~/.vimrc, ~/.gitconfig) định nghĩa môi trường làm việc của họ. Khi làm việc trên nhiều máy (laptop, desktop, VM, remote server), việc đồng bộ và quản lý dotfiles trở thành thách thức. Dotfiles manager là giải pháp: version control, deploy, và sync cấu hình một cách tự động.
Năm 2025, ba công cụ dẫn đầu là chezmoi, stow, và yadm. Mỗi công cụ có triết lý và ưu điểm riêng, phù hợp với các workflow khác nhau. Bài viết này sẽ đi sâu so sánh để bạn chọn công cụ phù hợp nhất.
Triết lý và cách hoạt động
- chezmoi: Template-based. Mỗi file dotfile được lưu dưới dạng template với biến (
{{ .personal.email }}). Khi deploy, chezmoi render template thành file thực tế. Hỗ trợ encryption cho secret. - stow: Symlink-based. Dotfiles được cấu trúc trong thư mục theo ứng dụng (
~/dotfiles/zsh/.zshrc). Chạystow zshsẽ tạo symlink từ~/.zshrctới~/dotfiles/zsh/.zshrc. - yadm (Yet Another Dotfiles Manager): Git wrapper. Dotfiles là git repository bình thường. Chạy
yadm altthay vìgit addđể tự động thay đổi đường dẫn trong commit message.
So sánh chi tiết
| Tiêu chí | chezmoi | stow | yadm |
|---|---|---|---|
| Installation | brew install chezmoi hoặc binary |
Thường có sẵn (brew install stow) |
brew install yadm hoặc pip |
| Setup | chezmoi init → edit templates | Di chuyển dotfiles vào repo theo cấu trúc stow | Di chuyển dotfiles vào repo → yadm init |
| Secret management | Tích hợp: ghi chú vào .local.config được encrypt bằng GPG/age |
Không tích hợp — cần external tool như pass hoặc 1password-cli |
Tích hợp qua yadm encrypt (AES-256) hoặc gpg |
| Template support | Có: Go template, hỗ trợ biến, condition, loop | Không — file được sao chép nguyên vẹn qua symlink | Không — trừ khi dùng pre-commit hook tùy chỉnh |
| Cross-platform | Tuyệt vời — cùng config cho macOS, Linux, Windows (WSL) | Tốt — nhưng cần handle đường dẫn khác nhau thủ công | Tốt — Git chạy everywhere |
| Learning curve | Trung bình — cần học Go template syntax | Dễ — chỉ là symlink, cấu trúc thư mục | Dễ — chỉ là git với một vài lệnh bổ sung |
| Performance | Nhanh — render template và tạo file | Nhanh nhất — chỉ tạo symlink | Chậm hơn vì git overhead |
| Community & ecosystem | Cộng đồng đang phát triển mạnh, nhiều plugin | Cổ điển — được sử dụng từ thời GNU Stow | Cộng đồng nhỏ nhưng dedicated |
| Best for | Developer cần template, secret, multi-platform | Minimalist, thích đơn giản, chỉ cần symlink | Người dùng Git mạnh, muốn toàn bộ là git repo |

Deep dive: chezmoi
chezmoi nổi bật với khả năng quản lý sự khác nhau giữa các môi trường. Ví dụ: laptop cần alias ll='ls -lh' nhưng server chỉ cần alias ll='ls -l'. Với template, bạn có thể viết:
{{ if eq .hostname "laptop" }}
alias ll='ls -lh'
{{ else }}
alias ll='ls -l'
{{ end }}
Chezmoi cũng hỗ trợ:
- Encryption:
chezmoi add --encrypt ~/.aws/credentials - Scripts: Chạy script trước/sau khi dotfile thay đổi (cài đặt package)
- Password store integration: Lấy secret từ
passhoặc1password - Difference:
chezmoi diffso sánh trạng thái mong muốn và thực tế
Ví dụ dotfile repository:
.dotfiles/ ├── .config/ │ └── nvim/ │ └── init.lua.tmpl ├── .zshrc.tmpl ├── .gitconfig.tmpl └── .local.config/ # chứa secret, không được version control
Deep dive: stow
Stow (một phần của GNU) triết lý đơn giản: dotfiles nằm trong thư mục con với tên ứng dụng. Cấu trúc mẫu:
~/dotfiles/
├── bash/
│ ├── .bashrc
│ └── .bash_profile
├── git/
│ └── .gitconfig
├── nvim/
│ ├── init.lua
│ └── .config/nvim/
└── zsh/
├── .zshrc
└── .oh-my-zsh/
Chạy:
stow bash git nvim zsh
sẽ tạo symlink:
~/.bashrc → dotfiles/bash/.bashrc ~/.gitconfig → dotfiles/git/.gitconfig ~/.zshrc → dotfiles/zsh/.zshrc
Ưu điểm lớn nhất của stow là rõ ràng — bạn luôn biết file thực tế ở đâu và symlink trỏ đến đâu. Nhược điểm là cần duy trì cấu trúc thư mục khớp với home directory, và không hỗ trợ template — nếu bạn cần cấu hình khác nhau giữa máy, phải tạo hai file khác nhau và quản lý handbook.
Deep dive: yadm
Yadm coi toàn bộ home directory như một git repository (theo cáchSafe). Lệnh chính là yadm thay vì git, tự động xử lý:
- Alt files: Khi chỉnh sửa
~/.bashrc, yadm thực sự thay đổi~/dotfiles/.bashrcvà ghi commit message nhưalternate: ~/.bashrc - Bootstrap: Chạy script sau khi clone repo để cài đặt package
- Encryption:
yadm encryptđể lưu trữ file nhạy cảm trong repo dưới dạng mã hoá - Per-host config: Nhánh git hoặc file
~/.config/yadm/host-specific
Yadm phù hợp với developer quen với Git và muốn tất cả công việc đều qua các lệnh Git quen thuộc. Tuy nhiên, vì nó làm việc trực tiếp trên home directory, có nguy cơ ghi đè file không intended nếu không cẩn thận.
Khi nào nên dùng công cụ nào?
Chọn chezmoi nếu bạn:
- Cần template để xử lý khác biệt giữa môi trường (dev/staging/prod)
- Có secret cần mã hoá (API key, token)
- Làm việc trên nhiều OS (macOS + Linux + Windows)
- Thích nhất quán hóa — mọi thứ được quản lý bởi một công cụ
Chọn stow nếu bạn:
- Thích sự đơn giản và minh bạch của symlink
- Chỉ cần quản lý cấu hình, không cần template hoặc secret
- Đã quen với cấu trúc thư mục ứng dụng-based
- Thích công cụ UNIX cổ điển, reliable hơn 30 năm
Chọn yadm nếu bạn:
- Quen với Git và muốn tất cả là Git workflow
- Cần version control mạnh mẽ (branch, merge, rebase)
- Thích bootstrap script tự động cài đặt package
- Không quan tâm đến template, chỉ cần deploy file nguyên vẹn
Best practices universal
Bất kể công cụ nào, áp dụng những thực hành sau:
- Chỉ version control file bạn thực sự chỉnh sửa: Đừng add toàn bộ
~/.confignếu chỉ thay đổi vài file. - Test trên máquina mới trước: Deploy vào VM sạch để đảm bảo không thiếu dependency.
- Automate bootstrap: Viết script cài đặt package manager (Homebrew, apt, pacman) và CLI tools.
- Sử dụng branch: Nhánh
devđể thử thay đổi,maincho ổn định. - Documentation: Ghi
README.mdgiải thích mỗi dotfile quan trọng và tại sao lại có giá trị như vậy.
Ví dụ bootstrap script cho chezmoi có thể:
#!/bin/bash
# Install Homebrew if missing
if ! command -v brew; then
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
# Install packages from Brewfile
brew bundle --file=$HOME/.dotfiles/Brewfile
# Apply chezmoi
chezmoi init --apply https://github.com/yourname/dotfiles.git
Kết luận
Không có công cụ “tốt nhất” tuyệt đối — chỉ có công cụ phù hợp nhất với nhu cầu và triết lý cá nhân của bạn. Chezmoi thắng khi cần tính linh hoạt cao (template, secret, multi-platform). Stow thắng khi bạn yêu cầu sự đơn giản, minh bạch, và tin tưởng vào một công cụ đã chứng minh giá trị qua các thập kỷ. Yadm thắng nếu bạn muốn tất cả công việc đều là Git và thích làm việc trong quy trình quen thuộc.
Hãy bắt đầu với một công cụ đơn giản (stow hoặc yadm), dùng thật trong 2-4 tuần, sau đó quyết định liệu bạn cần tính năng nâng cao của chezmoi hay không. Nhiều developer cuối cùng chuyển từ stow sang chezmoi khi nhu cầu quản lý secret và template tăng lên, nhưng cũng có nhiều người chỉ cần stow và dùng mãi mãi vì sự đơn giản của nó.
