使用 Git 監控目錄變更並建置 Lume

大家好,我是無能。
不久前
使用 inotifywait 在靜態網站 SSG 的 LumeCMS 發生變更時才重新建置
雖然我已經設定讓它自動建置,但它會在 vim 產生 swap 檔案時啟動,有時也會發現程序已死,或者無謂地執行建置,不是很穩定,這讓我很在意。所以我想到「如果用git管理,當有變更時就可以執行建置流程,而且如果發生什麼事也可以回溯,這樣不是很好嗎?」,腦中也浮現了一些可以用 shell script 寫的東西,所以就嘗試了一下。
大概是這樣
直接從頭開始看程式碼
也在 Github 上公開了。
#!/bin/bash
LUME_DIR="/your/lume/dir"
SRC_DIR="$LUME_DIR/src"
BUILD_DIR="site"
WEBPSH="/your/webp/convert/path"
COMMIT_COMMENT="`echo "Memory" && free -h | head -2 | awk '{print $(NF-5)"," $(NF-4)"," $(NF-3)}' | column -t -s ","`"
export DENO_INSTALL="/home/$USER/.deno"
export PATH="$DENO_INSTALL/bin:$PATH"
cd "$SRC_DIR" || exit
ls "$SRC_DIR/.git" || git init || exit
git add . || exit
git commit -m "$COMMIT_COMMENT"
if [ $? -eq 0 ]; then
$WEBPSH
cd $LUME_DIR || exit
# deno task lume --dest=$BUILD_DIR
deno task lume --dest=$BUILD_DIR > /dev/null 2>&1
else
exit 1
fi
總之,因為我想用盡可能短的程式碼來實現,所以就變成這樣了。
雖然COMMIT_COMMENT看起來有點雜亂,但這只是好玩而已...
一開始我是用date記錄時間,但現在用git log就能確認了,所以是不是不需要了呢?
(或許以後可以放一些隨機的 ASCII art 進去...)
我讓圖片上的腳本每 5 分鐘透過 cron 執行一次。
來看看 Git 的回傳值
總之,當使用 Git 執行git add .時的回傳值似乎無法偵測到變更,例如在尚未執行git init時的回傳值
alleycat:[haturatu]:~/git/gittest$ ls -la
合計 8
drwxr-xr-x 2 haturatu haturatu 4096 10月 14 01:08 .
drwxr-xr-x 72 haturatu haturatu 4096 10月 14 01:08 ..
alleycat:[haturatu]:~/git/gittest$ git add .
fatal: not a git repository (or any of the parent directories): .git
alleycat:[haturatu]:~/git/gittest$ echo $?
128
是128呢。
那麼,在執行git init之後,我們來建立或刪除檔案吧。
alleycat:[haturatu]:~/git/gittest$ ls -la
合計 12
drwxr-xr-x 3 haturatu haturatu 4096 10月 14 01:11 .
drwxr-xr-x 72 haturatu haturatu 4096 10月 14 01:08 ..
drwxr-xr-x 7 haturatu haturatu 4096 10月 14 01:11 .git
alleycat:[haturatu]:~/git/gittest$ git add .
alleycat:[haturatu]:~/git/gittest$ echo $?
0
alleycat:[haturatu]:~/git/gittest$ touch test
alleycat:[haturatu]:~/git/gittest$ ls -la
合計 12
drwxr-xr-x 3 haturatu haturatu 4096 10月 14 01:11 .
drwxr-xr-x 72 haturatu haturatu 4096 10月 14 01:08 ..
drwxr-xr-x 7 haturatu haturatu 4096 10月 14 01:11 .git
-rw-r--r-- 1 haturatu haturatu 0 10月 14 01:11 test
alleycat:[haturatu]:~/git/gittest$ git add .
alleycat:[haturatu]:~/git/gittest$ echo $?
0
因此,git add .的回傳值不會改變,所以無法偵測到變更。
那麼,我們來看看執行commit時的回傳值吧。
alleycat:[haturatu]:~/git/gittest$ ls -la
合計 12
drwxr-xr-x 3 haturatu haturatu 4096 10月 14 01:11 .
drwxr-xr-x 72 haturatu haturatu 4096 10月 14 01:08 ..
drwxr-xr-x 7 haturatu haturatu 4096 10月 14 01:11 .git
-rw-r--r-- 1 haturatu haturatu 0 10月 14 01:11 test
alleycat:[haturatu]:~/git/gittest$ git commit -m "nyaa"
[master (root-commit) 60bed93] nyaa
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test
alleycat:[haturatu]:~/git/gittest$ echo $?
0
alleycat:[haturatu]:~/git/gittest$ git commit -m "nyan nyan"
On branch master
nothing to commit, working tree clean
alleycat:[haturatu]:~/git/gittest$ echo $?
1
如果沒有變更,似乎會回傳 1。
因此,可以從這個回傳值來判斷,之後就隨心所欲了。
似乎相當深奧的變更監控
所以說,這種方法似乎可以用於其他變更管理。
但我一直在摸索的是,如何更輕鬆、輕量且遞迴地監控目錄變更,這看起來簡單卻不簡單。
對於find命令,它是一個非常強大的命令,所以在變更監控時執行它會有點麻煩(Git 內部命令也會執行它嗎?)。
如果必須自己編寫變更監控的程式碼,那麼對於要排除的目錄也必須加入判斷。從這點來看,使用 Git 進行變更監控,只要將不想監控的不必要目錄寫入.gitignore,就可以實質上將其從變更監控中排除。
從這點來看,Git 非常出色。
然而,由於 Git 將快取儲存在 .git 中,因此可能不適合監控包含大檔案的目錄。因此,或許可以將每個檔案進行哈希處理,儲存為文字檔到/tmp,然後進行 diff,如果回傳值有差異,就執行變更時的流程。
話雖如此,如果為了排除檔案而加入程式碼,並在 diff 之前進行排序...這樣做可能會變得相當複雜,所以我不太想這麼做。
寫的時候想到的...
其實不需要執行find,只要將ls -laR輸出到/tmp並取得差異就可以了。
但是為什麼我會覺得 Git 更輕量呢...?如果這樣想下去,感覺就必須開始解構 Git 了,所以今天就到此為止吧。
那麼,下次再見了。