找回密碼
 立即註冊
惟家LINE群QRCODE
    查看: 2|回覆: 0

    用 Git 版控你的 HA 設定:從零到「改完自動提交」

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    「我昨天改了什麼?」
    「這個自動化以前是怎麼寫的?」
    「我把設定改壞了,能不能回到三天前?」

    這三個問題 Git 都能回答,而且設定一次就一勞永逸。



    為什麼備份不夠

    HA 的備份是整包快照。你想知道「哪一行改了」它幫不上忙,
    而且還原是全有全無 —— 不能只還原某個自動化。

    Git 記的是每一次改動,可以:


    • 看任兩個時間點之間改了哪幾行
    • 只還原某一個檔案
    • 寫下「為什麼改」(提交訊息)
    • 在不同機器間同步設定


    第一步:裝 Terminal 附加元件

    設定 → 附加元件 → 附加元件商店 → Advanced SSH & Web Terminal

    裝好後在設定裡把 Protection mode 關掉(不然它只能看到自己的容器)。

    第二步:先寫 .gitignore(這步最重要)

    千萬不要在寫 .gitignore 之前就 git add。
    一旦密碼進了歷史紀錄,要清掉很麻煩。

    在 /config 建立 .gitignore
    1. # 憑證與密碼 —— 絕對不能進版控
    2. secrets.yaml
    3. .storage/
    4. *.key
    5. *.pem
    6. *.crt
    7. ssh/
    8. # 資料庫與日誌
    9. *.db
    10. *.db-*
    11. *.log
    12. home-assistant.log*
    13. home-assistant_v2.db*
    14. # 快取與暫存
    15. __pycache__/
    16. .cloud/
    17. .uuid
    18. tts/
    19. deps/
    20. image/
    21. backups/
    22. media/
    23. www/community/
    24. # 這個要不要納入自己決定
    25. # custom_components/   (HACS 裝的東西,通常不用進版控)
    複製代碼

    為什麼 .storage 不能進版控

    .storage 裡面有所有整合的存取權杖、雲端登入資訊、使用者密碼雜湊
    它是明文 JSON。進了版控就等於把家裡的鑰匙貼出去。

    但這也代表:Git 不能取代備份。
    .storage 只能靠 HA 的備份機制保護。兩個都要做。



    第三步:初始化
    1. cd /config
    2. git init
    3. git config user.name "charles"
    4. git config user.email "charles@example.com"
    5. # 先確認 .gitignore 有生效,再 add
    6. git add .gitignore
    7. git status        # ← 仔細看清單裡有沒有 secrets.yaml 或 .storage
    8. git add .
    9. git commit -m "初始設定"
    複製代碼

    git status 那一步不要跳過。
    我第一次做的時候,.storage 因為 .gitignore 少了斜線而被加進去了。

    第四步:推到遠端(可選但建議)

    本機的 Git 遇到硬碟壞掉一樣沒了。推到遠端才有異地保護。

    重要:倉庫一定要設成私有(Private)。
    1. # GitHub 建一個 private repo 之後
    2. git remote add origin git@github.com:你的帳號/ha-config.git
    3. git branch -M main
    4. git push -u origin main
    複製代碼

    用 SSH 金鑰比較方便:
    1. ssh-keygen -t ed25519 -C "ha-config" -f /config/ssh/gh_key
    2. cat /config/ssh/gh_key.pub      # 把這串貼到 GitHub 的 Deploy Keys
    複製代碼
    1. # /config/ssh/config
    2. Host github.com
    3.   IdentityFile /config/ssh/gh_key
    4.   IdentitiesOnly yes
    複製代碼

    記得 chmod 600 /config/ssh/gh_key,權限太開 ssh 會拒絕。

    第五步:讓它自動提交

    手動提交一定會忘記。做一個腳本每天自動跑:
    1. # /config/scripts/git_autocommit.sh
    2. #!/bin/bash
    3. cd /config || exit 1
    4. # 沒有變更就什麼都不做(避免一堆空提交)
    5. if [ -z "$(git status --porcelain)" ]; then
    6.   exit 0
    7. fi
    8. git add -A
    9. git commit -m "自動提交 $(date '+%Y-%m-%d %H:%M')"
    10. # 推不上去也不要讓腳本失敗(網路可能暫時不通)
    11. git push origin main || echo "push 失敗,下次再試"
    複製代碼
    1. chmod +x /config/scripts/git_autocommit.sh
    複製代碼

    接進 HA:
    1. shell_command:
    2.   git_autocommit: "bash /config/scripts/git_autocommit.sh >> /config/git.log 2>&1"
    複製代碼
    1. automation:
    2.   - alias: 每天自動提交設定
    3.     triggers:
    4.       - trigger: time
    5.         at: "03:30:00"
    6.     actions:
    7.       - action: shell_command.git_autocommit
    8.     mode: single
    複製代碼

    把輸出導到 git.log 是關鍵
    shell_command 失敗的話你只會看到一個 return code,什麼線索都沒有。

    日常怎麼用

    看最近改了什麼
    1. git log --oneline -20
    2. git log --stat -5              # 附帶哪些檔案改了幾行
    複製代碼

    看某一次改了哪幾行
    1. git show <commit>
    2. git show <commit> -- automations.yaml    # 只看某個檔案
    複製代碼

    比較兩個時間點
    1. git diff HEAD~5 HEAD -- automations.yaml
    複製代碼

    還原單一檔案到三天前
    1. git log --oneline --since="4 days ago" --until="3 days ago"
    2. git checkout <commit> -- automations.yaml
    3. # 然後在 HA 重新載入自動化
    複製代碼

    這個是 Git 真正勝過備份的地方 ——
    只還原一個檔案,其他設定完全不動。

    找出某一行是什麼時候改的
    1. git log -S "binary_sensor.走道感應" --oneline
    複製代碼

    會列出所有「增加或刪除這段文字」的提交。
    查「這個實體到底哪時候改名的」超好用。



    進階:用分支試新東西

    要做一個大改動(例如把 !include 改成 packages),先開分支:
    1. git checkout -b try-packages
    2. # 改一堆東西,重啟測試
    3. # 成功的話
    4. git checkout main
    5. git merge try-packages
    6. # 失敗的話
    7. git checkout main
    8. git branch -D try-packages      # 整個丟掉,主線完全不受影響
    複製代碼

    幾個實際踩過的坑

    1. 換行符號

    在 Windows 上編輯過的檔案會變成 CRLF,Linux 上的 HA 有時候會抱怨。
    設定一下:
    1. git config core.autocrlf input
    複製代碼

    2. automations.yaml 每次都整個變

    UI 編輯器存檔時會重新排序整個檔案,diff 會很醜。
    沒有好解法,習慣就好 —— 或者改用手寫 YAML 放在 packages 裡。

    3. 提交訊息寫「更新」等於沒寫
    1. # 沒用
    2. git commit -m "更新"
    3. # 有用
    4. git commit -m "浴室感應燈改成 restart,修正人還在裡面就關燈的問題"
    複製代碼

    三個月後只有第二種救得了你。

    4. 不要把 Git 當備份

    再講一次:.storage 不在版控裡
    純靠 Git 還原的話,所有整合都要重新設定、所有實體 ID 會跑掉。

    Git 管「你寫的邏輯」,HA 備份管「系統狀態」。兩個都要。

    ---

    我自己用了一年多,最常用的其實不是還原,是 git log -S
    —— 「這個奇怪的設定到底是誰、什麼時候、為什麼加的」。

    答案通常是三個月前的我,而且當時有寫原因。感謝當時的自己。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-9-24 12:18 , Processed in 0.075286 second(s), 24 queries .

    快速回覆 返回頂部 返回列表