我试图在除.gitignore之外的文件夹中监听文件更改以触发重建。
似乎使用带有--exclude选项的inotifywait是正确的方法。有没有人知道将.gitignore转换为正则表达式的好方法,以便inotifywait --exclude可以正确接受?
只要有效,我也会对其他解决方案持开放态度。
感谢。
答案 0 :(得分:3)
请勿提前告知inotifywait,最好通过git check-ignore -nv --stdin
运行修改后的路径。花更多时间使用gitignore文档,你就会明白为什么,这些模式来自多个来源,并且它们具有上下文敏感性,它们只是阻止事物被自动跟踪,它们不会阻止你专门跟踪无论如何,一个文件。
答案 1 :(得分:0)
这是一个完整的示例,该示例监视当前目录中非gitignored文件的更改,并在文件发生任何更改时运行./build
。
重要的一点是.git/
不是.gitignored
,因此我们也对其进行检查和忽略。
inotifywait --event close_write --monitor --recursive . |
while read -r directory events filename; do
echo "directory events filename: \"${directory}\" \"${events}\" \"${filename}\""
if ! echo "$directory" | grep -Eq '^\.\/\.git' &&
! git check-ignore --non-matching --verbose "${directory}/${filename}" >/dev/null 2>&1
then
echo 'will build'
./build
fi
done
如果您是Vim用户,则还需要配置:
set backupcopy=no
set noswapfile
set nowritebackup
在Vim 8.1中,set backupcopy=no
会阻止以下类型的事件:
directory events filename: "./" "CLOSE_WRITE,CLOSE" "4913"
在以下位置提到了烦人的4913
:
(使用vim -u NONE
使TODO最小化)阻止创建.swp
文件:How to prevent vim from creating (and leaving) temporary files?
理想情况下,我们也会有--event moved_to,create
,但是即使我试图关闭所有临时文件,Vim也会在每个:w
上生成3个事件(TODO将vim -u NONE
的示例配置最小化) :
directory events filename: "./" "MOVED_TO" "README.adoc~"
directory events filename: "./" "CREATE" "README.adoc"
directory events filename: "./" "CLOSE_WRITE,CLOSE" "README.adoc"
您还可以考虑检查文件是否经过git跟踪以自动包含.git
:How to tell if a file is git tracked (by shell exit code)?,但是这种方法更好,因为它甚至在开始测试新文件之前就使用了它们跟踪。