使用 Git 监控目录更改并构建 Lume

6 min

language: ja bn en es hi pt ru zh-cn zh-tw

Image
大家好,我是无能。
很久以前,我写了一篇文章:
使用 inotifywait 仅在静态网站SSG LumeCMS 中发生更改时重新构建
虽然我让它自动构建了,但它在 vim swap 文件创建时也会运行,有时还会发现进程已死,或者无谓地运行构建,不太稳定,这让我很在意,所以我想到“如果用 git 管理,当有更改时就可以运行构建流程,而且如果发生什么还可以回滚,这不是很棒吗?”并且脑海中也浮现出了一些用 shell 脚本编写的想法,所以我就尝试了一下。

就是这种感觉

直接从头开始看代码吧。
它也在 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 艺术了……)

图片上方的脚本通过 cron 每5分钟执行一次。

来看看 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 了,所以今天就到这里吧。
那么,下次再见,请多关照。

Related Posts