Day 7:第一週複習 — 用 Git 管理你的 NixOS 配置,建立版本控制的好習慣
第一週總複習,回顧 Day 1 到 Day 6 的核心觀念,並學會用 Git 管理 NixOS 配置檔,建立良好的版本控制習慣。
Day 7:第一週複習 — 用 Git 管理你的 NixOS 配置,建立版本控制的好習慣
📘 系列:NixOS 30 天學習之旅
📦 階段:第一階段 — 基礎與生存守則(Day 1 – Day 7)
🎯 階段核心目標:理解聲明式(Declarative)配置與不可變性
前言:為什麼第一週複習這麼重要?
恭喜你撐過了第一週!🎉
在過去六天裡,我們從零開始認識 NixOS,一路從安裝、設定,到理解它的核心哲學。如果你現在回想起來,腦中浮現的是一堆零散的指令和概念,那完全正常 — 這正是為什麼我們需要一個「收束日」。
今天的目標很明確:
- 整理第一週的知識脈絡,讓零散的知識點串成一條線。
- 用 Git 管理你的 NixOS 配置,建立版本控制的習慣。
- 上傳到 GitHub,為日後的協作與備份打下基礎。
這不只是複習,更是一個里程碑 — 從「摸索 NixOS」邁向「有系統地管理 NixOS」。
第一週知識點總整理
讓我們快速回顧這六天走過的路:
Day 1:為什麼選擇 NixOS?
- NixOS 是一個基於 Nix package manager 的 Linux 發行版
- 核心特色:Declarative configuration(聲明式配置)與 Immutability(不可變性)
- 傳統發行版是「一步步安裝設定」,NixOS 是「用一份文件描述整個系統狀態」
Day 2:安裝 NixOS
- 下載 ISO、製作開機碟、完成安裝
- 認識磁碟分割與基本的安裝流程
- 第一次執行
nixos-install的興奮(或崩潰)
Day 3:認識 configuration.nix
/etc/nixos/configuration.nix是整個系統的「藍圖」- 理解 Nix 語言的基本語法:attribute set、list、string
- 第一次修改設定並執行
sudo nixos-rebuild switch
Day 4:套件管理
- 在
configuration.nix中用environment.systemPackages安裝系統層級套件 - 認識
nix-env的 user-level 套件管理(以及為什麼不建議過度依賴它) - 學會用
nix search或 search.nixos.org 查找套件
Day 5:Nix 語言入門
- Nix 是一門 purely functional 的語言
- 認識基本型別:string、integer、boolean、list、attribute set
- 理解
let ... in ...表達式與函式定義 import的用法:拆分設定檔的第一步
Day 6:系統服務與基礎客製化
- 用
services.xxx.enable = true啟用系統服務 - 設定網路、時區、locale 等基礎配置
- 管理使用者帳號與群組
- 理解
nixos-rebuild switchvsnixos-rebuild testvsnixos-rebuild boot的差異
串起來的核心概念
回顧完每一天的內容後,我們可以歸納出第一階段的核心精神:
你的系統 = f(configuration.nix)
這就是 NixOS 的 Declarative 哲學:系統的狀態完全由配置文件決定。同一份 configuration.nix,在任何機器上執行 nixos-rebuild switch,都應該產生相同的系統狀態。
這也是為什麼接下來我們要用 Git 管理這份配置 — 因為它值得被版本控制。
用 Git 管理你的 NixOS 配置
為什麼要用 Git?
既然 configuration.nix 定義了你的整個系統,那它就是你最重要的資產之一。用 Git 管理它,你可以:
- 追蹤每一次變更:知道自己什麼時候改了什麼,為什麼改
- 安心實驗:改壞了?
git checkout一下就回來了 - 跨機器同步:多台 NixOS 機器可以共享同一份配置
- 協作與分享:把你的 dotfiles 公開,讓社群學習交流
初始化 Git Repository
首先,進入 NixOS 配置目錄並初始化 Git:
cd /etc/nixos
sudo git init
💡 注意:
/etc/nixos預設是 root 擁有的目錄,所以大部分操作需要sudo。如果你覺得每次都要sudo git很麻煩,後面會介紹更好的做法。
建立合適的 .gitignore
在開始追蹤之前,先設定好 .gitignore,避免不必要的檔案進入版本控制:
sudo tee /etc/nixos/.gitignore << 'EOF'
# Hardware configuration is machine-specific
# 如果你想跨機器共用配置,建議忽略此檔
# hardware-configuration.nix
# Nix build results
result
result-*
# Backup files
*.swp
*.swo
*~
\#*\#
# OS generated files
.DS_Store
Thumbs.db
EOF
🤔 要不要忽略
hardware-configuration.nix?這取決於你的使用情境:
- 單機使用:建議一起追蹤,方便完整備份還原
- 多機共用配置:建議忽略,因為每台機器的硬體配置不同
第一週我們先保留它,後續進階階段再來處理多機管理。
第一次 Commit
cd /etc/nixos
sudo git add .
sudo git commit -m "Initial commit: NixOS configuration after Day 7"
來看看我們追蹤了哪些檔案:
sudo git log --oneline
# a1b2c3d Initial commit: NixOS configuration after Day 7
sudo git show --stat HEAD
# configuration.nix | 42 +++++++++++++++++++++
# hardware-configuration.nix | 28 ++++++++++++++
# .gitignore | 15 ++++++++
# 3 files changed, 85 insertions(+)
恭喜!你的 NixOS 配置現在有版本控制了。
建立 GitHub Repository 並上傳
Step 1:在 GitHub 建立 Repository
前往 github.com/new,建立一個新的 repository:
- Repository name:
nixos-config(或你喜歡的名字) - Description:
My NixOS configuration files - Visibility:建議先設為 Private(畢竟配置可能包含機敏資訊)
- 不要勾選 Initialize with README(我們本地已有檔案)
Step 2:連結 Remote 並推送
如果你已經安裝了 gh(GitHub CLI),可以直接用指令建立:
# 方法一:使用 GitHub CLI(推薦)
cd /etc/nixos
sudo gh repo create nixos-config --private --source=. --push
# 方法二:手動設定 remote
cd /etc/nixos
sudo git remote add origin git@github.com:<your-username>/nixos-config.git
sudo git branch -M main
sudo git push -u origin main
⚠️ 安全提醒:推送前請再三確認你的配置中沒有明文密碼、API key 或其他 secret。如果有,務必先移除或改用
agenix、sops-nix等 secret 管理工具。
Step 3:驗證上傳成功
sudo git remote -v
# origin git@github.com:<your-username>/nixos-config.git (fetch)
# origin git@github.com:<your-username>/nixos-config.git (push)
sudo git log --oneline --all
# a1b2c3d (HEAD -> main, origin/main) Initial commit: NixOS configuration after Day 7
更好的做法:將配置搬到 Home 目錄
每次都要 sudo git 其實不太方便,而且 Git 的使用者設定(user.name、user.email)在 root 底下管理也不直覺。社群中更常見的做法是:
將配置放在使用者目錄,再 symlink 回去
# 1. 將配置複製到 home 目錄
cp -r /etc/nixos ~/nixos-config
cd ~/nixos-config
# 2. 在這裡初始化 Git(不需要 sudo)
git init
git add .
git commit -m "Initial commit: NixOS configuration"
# 3. 在 configuration.nix 中設定 NixOS 讀取路徑
# 或者在 rebuild 時指定路徑:
sudo nixos-rebuild switch -I nixos-config=$HOME/nixos-config
另一種更優雅的做法是透過 configuration.nix 中的 imports 指向你 home 目錄下的設定檔,但這涉及較進階的技巧,我們在第二階段再來探討。
配置管理的最佳實踐
經過第一週的學習,這裡整理幾個建議,幫你建立良好的 NixOS 配置管理習慣:
1. 每次修改都 commit
# 養成習慣:改完設定 → rebuild → 確認沒問題 → commit
sudo nixos-rebuild switch
sudo git add -A
sudo git commit -m "feat: enable OpenSSH and configure firewall"
使用有意義的 commit message,未來回顧時會感謝自己。
2. 善用 Git Branch 做實驗
# 想試試看新的桌面環境?開個 branch
sudo git checkout -b experiment/kde-desktop
# 修改 configuration.nix ...
sudo nixos-rebuild switch
# 不喜歡?切回去就好
sudo git checkout main
sudo nixos-rebuild switch
3. 拆分設定檔
隨著配置越來越複雜,建議將 configuration.nix 拆分成多個模組:
# configuration.nix
{ config, pkgs, ... }:
{
imports = [
./hardware-configuration.nix
./packages.nix # 套件清單
./services.nix # 服務設定
./users.nix # 使用者管理
./networking.nix # 網路設定
];
# 只保留最核心的系統設定
system.stateVersion = "24.05";
}
這樣每個檔案職責清楚,Git diff 也更容易閱讀。
4. 定期推送到 Remote
# 養成每天結束前 push 的習慣
sudo git push origin main
萬一硬碟壞了,你的系統配置還安安穩穩躺在 GitHub 上。
5. 善用 NixOS 的 Generation 機制
NixOS 每次 nixos-rebuild switch 都會建立一個新的 generation。你可以隨時查看或回滾:
# 列出所有 generation
sudo nix-env --list-generations --profile /nix/var/nix/profiles/system
# 回滾到上一個 generation
sudo nixos-rebuild switch --rollback
# 或是在開機選單(GRUB)中選擇舊的 generation
Git 管理的是「配置的歷史」,而 generation 管理的是「系統狀態的歷史」。兩者相輔相成,讓你的系統管理萬無一失。
第一階段總結
讓我們用一張表來總結第一階段學到的核心概念:
| 概念 | 說明 |
|---|---|
| Declarative Configuration | 用 configuration.nix 描述系統「應該長什麼樣子」 |
| Immutability | 系統狀態不可直接修改,只能透過 rebuild 產生新的 generation |
| Reproducibility | 同一份配置 → 同一個系統狀態 |
| Rollback | 隨時回到任何一個歷史 generation |
| Nix Language | 用來撰寫配置的 purely functional 語言 |
| nixos-rebuild | 將配置文件「實現」為系統狀態的核心指令 |
| Version Control | 用 Git 管理配置,讓聲明式的優勢最大化 |
你現在擁有的能力
經過這一週,你已經能夠:
- ✅ 安裝並啟動一個 NixOS 系統
- ✅ 閱讀並修改
configuration.nix - ✅ 安裝套件與啟用系統服務
- ✅ 理解 Nix 語言的基本語法
- ✅ 使用
nixos-rebuild的各種模式 - ✅ 用 Git 管理你的系統配置
這些就是在 NixOS 上「生存」所需的基本技能。接下來,我們要進入更精彩的部分。
第二階段預告:模組化與 Flakes
第二階段(Day 8 – Day 14)的主題是 模組化與 Flakes。我們將深入探討:
- Nix Modules 系統:NixOS 強大的模組化機制,讓你的配置更有組織
- 自定義 Module:撰寫自己的 NixOS module,封裝可重用的配置
- Flakes 入門:Nix 生態系的未來 — 更好的可重現性與依賴管理
- flake.nix 實戰:將你的配置從傳統模式遷移到 Flakes
- 開發環境管理:用
devShells為不同專案建立隔離的開發環境
如果說第一階段是「學會走路」,那第二階段就是「學會跑步」。Flakes 是目前 NixOS 社群最熱門的話題,掌握它將大幅提升你的 Nix 使用體驗。
今日小作業
在進入第二階段之前,請確認你已經完成以下事項:
- 將
/etc/nixos用 Git 初始化並完成第一次 commit - 建立 GitHub repository 並成功推送
- 確認
.gitignore設定合理 - 回顧 Day 1 到 Day 6 的筆記,確認沒有遺漏的概念
- (選擇性)嘗試將配置拆分成至少 2 個檔案
完成這些,你就為第二階段做好了準備。明天見!🚀
📌 本篇重點回顧
- NixOS 的核心哲學:
系統 = f(配置)- Git 是管理 NixOS 配置的最佳夥伴
- 每次修改都應該 commit,善用 branch 做實驗
- Generation 與 Git 歷史相輔相成
- 第二階段將進入 Modules 與 Flakes 的世界