GNU Stow
GNU Stow
GNU Stow 是一個 symlink farm manager,原本設計給軟體安裝用(把 /usr/local/stow/program/ 下的檔案 symlink 到 /usr/local/),在 dotfile 管理場景被借來做「把 repo 裡的配置檔 symlink 到家目錄」。
核心規則
Stow 的核心規則只有一條:package 目錄內的路徑結構,就是安裝後相對於目標目錄的路徑結構。
1~/dotfiles/zsh/.zshrc → ~/.zshrc
2~/dotfiles/nvim/.config/nvim/ → ~/.config/nvim/
3~/dotfiles/git/.gitconfig → ~/.gitconfig每個頂層目錄(zsh/、nvim/、git/)是一個 stow package,可以獨立安裝或移除。
常用指令
1cd ~/dotfiles
2
3# 安裝:在目標目錄(預設 $HOME 的上一層,通常用 --target)建立 symlink
4stow zsh # 安裝 zsh package
5stow zsh git nvim tmux # 批次安裝多個 package
6stow */ # 安裝所有 package
7
8# 移除:刪除該 package 建立的 symlink
9stow -D nvim
10
11# 重新安裝(移除 + 安裝)
12stow -R zsh
13
14# 收養:如果目標位置已有檔案,--adopt 把它移進 repo 再建 symlink
15stow --adopt zsh--adopt 是首次把現有配置納入 dotfile 管理時的關鍵操作——它把家目錄的既有檔案「收養」進 repo(移動過去),然後建 symlink。之後 git diff 就能看到 repo 版本跟原版的差異。
Folding 與 Unfolding
Stow 會自動判斷要 symlink 整個目錄還是逐一 symlink 檔案:
- Folding:目標目錄不存在、或目錄內所有檔案都由同一個 package 管理 → symlink 整個目錄
- Unfolding:目標目錄已有其他來源的檔案 → 展開成逐檔 symlink,保留既有檔案不受影響
這個機制讓多個 package 可以共存於同一個目標目錄(如 ~/.config/)。
限制
- 只管 symlink 映射,不管套件安裝(套件由 Brewfile 或 packages.txt 處理)
- 不管 file permission——需要 0600 的 secret 檔靠 symlink 繼承來源權限,無法在部署時自動 chmod
- 沒有 template 機制——同一份配置在不同機器要不同內容時,需要在配置檔內用 shell 的 OS 判斷處理
完整選型比較見管理策略與選型。