<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Dotfiles on recca0120 技術筆記</title><link>https://recca0120.github.io/tags/dotfiles/</link><description>Recent content in Dotfiles on recca0120 技術筆記</description><generator>Hugo -- gohugo.io</generator><language>zh-hant-tw</language><lastBuildDate>Mon, 13 Apr 2026 15:30:00 +0800</lastBuildDate><atom:link href="https://recca0120.github.io/tags/dotfiles/index.xml" rel="self" type="application/rss+xml"/><item><title>chezmoi：用一份 dotfiles 打通 macOS、Linux、Windows 三個作業系統</title><link>https://recca0120.github.io/2026/04/13/chezmoi-dotfiles-management/</link><pubDate>Mon, 13 Apr 2026 15:30:00 +0800</pubDate><guid>https://recca0120.github.io/2026/04/13/chezmoi-dotfiles-management/</guid><description>&lt;img src="https://recca0120.github.io/" alt="Featured image of post chezmoi：用一份 dotfiles 打通 macOS、Linux、Windows 三個作業系統" /&gt;&lt;p&gt;我工作機是 MacBook、家裡有台 Linux 桌機、公司還丟了一台 Windows NUC 過來。三台機器的 &lt;code&gt;.gitconfig&lt;/code&gt;、&lt;code&gt;.zshrc&lt;/code&gt;、&lt;code&gt;.tmux.conf&lt;/code&gt; 要同步，但每台 OS 的細節又不一樣——Windows 需要額外指定 &lt;code&gt;sslCAInfo&lt;/code&gt; 指到 scoop 裝的 git 憑證路徑，macOS 要跑 Homebrew，Linux 要跑 apt。&lt;/p&gt;
&lt;p&gt;以前我用 symlink + shell script 硬搞，現在改用 &lt;a class="link" href="https://github.com/twpayne/chezmoi" target="_blank" rel="noopener"
 &gt;chezmoi&lt;/a&gt;。同一份 dotfiles repo，三台機器 &lt;code&gt;chezmoi init --apply&lt;/code&gt; 一行搞定。&lt;/p&gt;
&lt;h2 id="為什麼不是-stowyadm-或-dotbot"&gt;&lt;a href="#%e7%82%ba%e4%bb%80%e9%ba%bc%e4%b8%8d%e6%98%af-stowyadm-%e6%88%96-dotbot" class="header-anchor"&gt;&lt;/a&gt;為什麼不是 stow、yadm 或 dotbot
&lt;/h2&gt;&lt;p&gt;dotfiles 管理器很多，chezmoi 勝出的點在三個：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Go template&lt;/strong&gt;：同一個檔案在不同 OS 會展開成不同內容，不用維護三份 &lt;code&gt;.gitconfig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加密原生整合&lt;/strong&gt;：age、gpg 直接接，私密檔案能放進公開 repo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;onchange script&lt;/strong&gt;：裝 Homebrew package 的 script 只在清單變更時跑，不會每次 apply 都重裝&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;stow 是純 symlink，沒模板；yadm 是 git wrapper，模板靠外掛；dotbot 要寫 YAML 清單。chezmoi 把這些整合在一個 binary 裡。&lt;/p&gt;
&lt;h2 id="安裝與初始化"&gt;&lt;a href="#%e5%ae%89%e8%a3%9d%e8%88%87%e5%88%9d%e5%a7%8b%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;安裝與初始化
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# macOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install chezmoi
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Linux&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sh -c &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -fsLS get.chezmoi.io&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Windows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winget install twpayne.chezmoi
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;新機器從既有 repo 拉下來並直接套用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi init --apply https://github.com/YOUR_USERNAME/dotfiles.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;這行會做三件事：clone repo → 跑 template engine → 把結果寫到 &lt;code&gt;$HOME&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="檔名命名規則"&gt;&lt;a href="#%e6%aa%94%e5%90%8d%e5%91%bd%e5%90%8d%e8%a6%8f%e5%89%87" class="header-anchor"&gt;&lt;/a&gt;檔名命名規則
&lt;/h2&gt;&lt;p&gt;chezmoi 靠&lt;strong&gt;檔名前綴&lt;/strong&gt;決定套用時的行為。這設計讓 repo 裡的檔案本身就是設定，不需要額外的 manifest。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;前綴&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;th&gt;範例&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;dot_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;目標是隱藏檔&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;dot_zshrc&lt;/code&gt; → &lt;code&gt;~/.zshrc&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;private_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;只留 user 權限（0600）&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;private_dot_ssh&lt;/code&gt; → &lt;code&gt;~/.ssh&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;executable_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;加可執行權限&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;executable_bin_foo&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;encrypted_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;用 age/gpg 加密&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;encrypted_dot_env&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;symlink_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;建 symlink&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;symlink_dot_bashrc&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;readonly_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;拿掉寫入權限&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;readonly_dot_config.toml&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;檔尾 &lt;code&gt;.tmpl&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;套 template 引擎&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;dot_gitconfig.tmpl&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;前綴可以疊加。我的 repo 裡有這樣的組合：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;private_executable_dot_php-cs-fixer.dist.php → ~/.php-cs-fixer.dist.php（0700）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;private_dot_ssh/ → ~/.ssh（0700 整個資料夾）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="用-template-處理機器差異"&gt;&lt;a href="#%e7%94%a8-template-%e8%99%95%e7%90%86%e6%a9%9f%e5%99%a8%e5%b7%ae%e7%95%b0" class="header-anchor"&gt;&lt;/a&gt;用 template 處理機器差異
&lt;/h2&gt;&lt;p&gt;這是 chezmoi 最實用的功能。我的 &lt;code&gt;dot_gitconfig.tmpl&lt;/code&gt; 長這樣：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gotmpl" data-lang="gotmpl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt;[user]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt; name = &lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;quote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt; email = &lt;/span&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.email&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;quote&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt;[http]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt; sslBackend = openssl
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;eq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.os&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;windows&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;-}}&lt;/span&gt;&lt;span class="x"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt; sslCAInfo = &lt;/span&gt;&lt;span class="cp"&gt;{{-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.homeDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\\&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;-}}&lt;/span&gt;&lt;span class="x"&gt;/scoop/apps/git/current/mingw64/ssl/certs/ca-bundle.crt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt;[core]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt; autocrlf = false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="x"&gt; symlinks = true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;.name&lt;/code&gt; 和 &lt;code&gt;.email&lt;/code&gt; 從 &lt;code&gt;~/.config/chezmoi/chezmoi.toml&lt;/code&gt; 讀，不同機器可以有不同值；&lt;code&gt;{{ if eq .chezmoi.os &amp;quot;windows&amp;quot; }}&lt;/code&gt; 只在 Windows 展開。apply 的時候 chezmoi 會把 &lt;code&gt;.tmpl&lt;/code&gt; 吃掉，寫出乾淨的 &lt;code&gt;.gitconfig&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;chezmoi 內建很多變數：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-gotmpl" data-lang="gotmpl"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.os&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt; # &amp;#34;darwin&amp;#34; / &amp;#34;linux&amp;#34; / &amp;#34;windows&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.arch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt; # &amp;#34;amd64&amp;#34; / &amp;#34;arm64&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.hostname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt; # 機器名
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.username&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt; # 登入帳號
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="na"&gt;.chezmoi.homeDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;}}&lt;/span&gt;&lt;span class="x"&gt; # 家目錄
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;要看某台機器展開後的結果，不用真的 apply：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi execute-template &amp;lt; dot_gitconfig.tmpl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="用-age-加密私密檔"&gt;&lt;a href="#%e7%94%a8-age-%e5%8a%a0%e5%af%86%e7%a7%81%e5%af%86%e6%aa%94" class="header-anchor"&gt;&lt;/a&gt;用 age 加密私密檔
&lt;/h2&gt;&lt;p&gt;我 repo 是公開的，但裡面有 SSH key 跟資料庫密碼備份檔。這些用 &lt;a class="link" href="https://github.com/FiloSottile/age" target="_blank" rel="noopener"
 &gt;age&lt;/a&gt; 加密後才進 commit。&lt;/p&gt;
&lt;p&gt;先產 age key：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;age-keygen -o ~/key.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Public key: age1examplepublickeyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;接著在 &lt;code&gt;~/.config/chezmoi/chezmoi.toml&lt;/code&gt; 設定：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;encryption&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;age&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;identity&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;~/key.txt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;recipient&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;age1examplepublickeyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;然後用 &lt;code&gt;--encrypt&lt;/code&gt; 加檔：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi add --encrypt ~/.ssh/id_ed25519
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;repo 裡只會看到 &lt;code&gt;private_dot_ssh/encrypted_private_id_ed25519.age&lt;/code&gt;，打開是亂碼。apply 時 chezmoi 會用 &lt;code&gt;~/key.txt&lt;/code&gt; 解密後寫到目標位置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;唯一的天大陷阱&lt;/strong&gt;：&lt;code&gt;key.txt&lt;/code&gt; 本身&lt;strong&gt;絕對不能放進 repo&lt;/strong&gt;。我的作法是把它 GPG 加密後放到密碼管理器，新機器要先手動還原 &lt;code&gt;key.txt&lt;/code&gt;，然後才能 &lt;code&gt;chezmoi init --apply&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="run_onchange-script套件清單變才重裝"&gt;&lt;a href="#run_onchange-script%e5%a5%97%e4%bb%b6%e6%b8%85%e5%96%ae%e8%ae%8a%e6%89%8d%e9%87%8d%e8%a3%9d" class="header-anchor"&gt;&lt;/a&gt;run_onchange script：套件清單變才重裝
&lt;/h2&gt;&lt;p&gt;我的 repo 有個 &lt;code&gt;.chezmoiscripts/darwin/run_onchange_00_install-packages.sh.tmpl&lt;/code&gt;，裡面長這樣：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{{&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; eq .chezmoi.os &lt;span class="s2"&gt;&amp;#34;darwin&amp;#34;&lt;/span&gt; -&lt;span class="o"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install mas
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install asdf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;asdf plugin add nodejs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;asdf install nodejs latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;asdf &lt;span class="nb"&gt;set&lt;/span&gt; nodejs latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ... 一大堆 asdf install&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{{&lt;/span&gt; end -&lt;span class="o"&gt;}}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;檔名的 &lt;code&gt;run_onchange_&lt;/code&gt; 是關鍵：chezmoi 只有在這個 script &lt;strong&gt;內容 hash 變了&lt;/strong&gt;才會執行。套件清單沒改就不重跑，避免每次 &lt;code&gt;chezmoi apply&lt;/code&gt; 都花五分鐘在 &lt;code&gt;brew install&lt;/code&gt; 已裝好的東西。&lt;/p&gt;
&lt;p&gt;script 命名有四種：&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;前綴&lt;/th&gt;
 &lt;th&gt;觸發時機&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;run_once_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;同內容一輩子只跑一次&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;run_onchange_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;內容變了才跑&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;run_onchange_before_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;套檔案&lt;strong&gt;之前&lt;/strong&gt;跑（裝 package manager）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;run_onchange_after_&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;套檔案&lt;strong&gt;之後&lt;/strong&gt;跑（啟用 fish plugin）&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;檔名前面的數字（&lt;code&gt;00_&lt;/code&gt;、&lt;code&gt;01_&lt;/code&gt;、&lt;code&gt;02_&lt;/code&gt;）控制執行順序。&lt;/p&gt;
&lt;h2 id="chezmoirootrepo-子目錄當-source"&gt;&lt;a href="#chezmoirootrepo-%e5%ad%90%e7%9b%ae%e9%8c%84%e7%95%b6-source" class="header-anchor"&gt;&lt;/a&gt;.chezmoiroot：repo 子目錄當 source
&lt;/h2&gt;&lt;p&gt;看了我 repo 有注意到所有檔案都在 &lt;code&gt;home/&lt;/code&gt; 底下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotfiles/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── .chezmoiroot # 內容只有 &amp;#34;home&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── Readme.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── install.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;├── install.ps1
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── home/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── dot_zshrc.tmpl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── dot_gitconfig.tmpl
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── .chezmoiscripts/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;.chezmoiroot&lt;/code&gt; 這個檔案告訴 chezmoi「source 在子目錄 &lt;code&gt;home/&lt;/code&gt;」，這樣 repo 根目錄就能放 README、install script 之類的專案檔案，不會被 chezmoi 當成 dotfiles 處理。&lt;/p&gt;
&lt;p&gt;對於想把 dotfiles repo 當正常專案維護的人很實用。&lt;/p&gt;
&lt;h2 id="chezmoiignore跳過某些檔案"&gt;&lt;a href="#chezmoiignore%e8%b7%b3%e9%81%8e%e6%9f%90%e4%ba%9b%e6%aa%94%e6%a1%88" class="header-anchor"&gt;&lt;/a&gt;.chezmoiignore：跳過某些檔案
&lt;/h2&gt;&lt;p&gt;跟 &lt;code&gt;.gitignore&lt;/code&gt; 語法一樣，但支援 template。範例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;README.md
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LICENSE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ if ne .chezmoi.os &amp;#34;darwin&amp;#34; }}
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.aerospace.toml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Library/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;{{ end }}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;非 macOS 的機器就會忽略 aerospace 視窗管理器設定跟 Library 資料夾。&lt;/p&gt;
&lt;h2 id="常用指令"&gt;&lt;a href="#%e5%b8%b8%e7%94%a8%e6%8c%87%e4%bb%a4" class="header-anchor"&gt;&lt;/a&gt;常用指令
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi add ~/.vimrc &lt;span class="c1"&gt;# 把現有檔案加入 repo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi add --encrypt ~/.env &lt;span class="c1"&gt;# 加密後加入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi edit ~/.zshrc &lt;span class="c1"&gt;# 直接編輯 source 檔&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi diff &lt;span class="c1"&gt;# 看 source 和 target 的差異&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi apply &lt;span class="c1"&gt;# 套用到 $HOME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi apply --dry-run -v &lt;span class="c1"&gt;# 預覽要做什麼&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="c1"&gt;# 進入 source 目錄&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi update &lt;span class="c1"&gt;# git pull + apply&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chezmoi doctor &lt;span class="c1"&gt;# 檢查環境&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;chezmoi doctor&lt;/code&gt; 會列出加密工具、template 引擎、git 等的可用狀態，新機器出問題先跑這個。&lt;/p&gt;
&lt;h2 id="跟-zoxidefish-的整合"&gt;&lt;a href="#%e8%b7%9f-zoxidefish-%e7%9a%84%e6%95%b4%e5%90%88" class="header-anchor"&gt;&lt;/a&gt;跟 &lt;a class="link" href="https://recca0120.github.io/2026/04/13/zoxide-smarter-cd/" &gt;zoxide&lt;/a&gt;、fish 的整合
&lt;/h2&gt;&lt;p&gt;我的 fish shell 設定、zoxide 初始化、tmux plugin 都在 chezmoi 管理下。每次換新機器：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;還原 age key&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sh -c &amp;quot;$(curl -fsLS get.chezmoi.io)&amp;quot; -- init --apply recca0120&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;run_onchange script 自動跑 brew / apt / scoop 裝所有 CLI 工具&lt;/li&gt;
&lt;li&gt;設定檔全部就位&lt;/li&gt;
&lt;li&gt;打開 fish，zoxide、starship、fzf 都是設定好的&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;整個新機 setup 大概 20 分鐘，主要時間花在等 &lt;code&gt;brew install&lt;/code&gt; 下載。&lt;/p&gt;
&lt;h2 id="缺點與注意事項"&gt;&lt;a href="#%e7%bc%ba%e9%bb%9e%e8%88%87%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a0%85" class="header-anchor"&gt;&lt;/a&gt;缺點與注意事項
&lt;/h2&gt;&lt;p&gt;chezmoi 不是萬靈丹：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Template 學習曲線&lt;/strong&gt;：Go template 語法對新手有點硬，&lt;code&gt;{{- }}&lt;/code&gt; 跟 &lt;code&gt;{{ }}&lt;/code&gt; 的空白處理要花時間搞懂&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Debug 痛苦&lt;/strong&gt;：template 展開錯的時候錯誤訊息很簡略，常要 &lt;code&gt;chezmoi execute-template&lt;/code&gt; 單獨測&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;age key 管理&lt;/strong&gt;：key 掉了所有加密檔都解不開，務必另外備份（我 GPG 加密後放密碼管理器）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;初次 apply 要小心&lt;/strong&gt;：如果 &lt;code&gt;$HOME&lt;/code&gt; 已經有手改過的 dotfiles，apply 會覆蓋掉，先 &lt;code&gt;chezmoi diff&lt;/code&gt; 確認&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="參考資源"&gt;&lt;a href="#%e5%8f%83%e8%80%83%e8%b3%87%e6%ba%90" class="header-anchor"&gt;&lt;/a&gt;參考資源
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/twpayne/chezmoi" target="_blank" rel="noopener"
 &gt;chezmoi GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.chezmoi.io/" target="_blank" rel="noopener"
 &gt;chezmoi 官方文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.chezmoi.io/quick-start/" target="_blank" rel="noopener"
 &gt;chezmoi Quick Start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/FiloSottile/age" target="_blank" rel="noopener"
 &gt;age — Simple File Encryption&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://natelandau.com/managing-dotfiles-with-chezmoi/" target="_blank" rel="noopener"
 &gt;Managing Dotfiles With Chezmoi — Nathaniel Landau&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>