inotify:监视除.gitignore之外的文件更改?

时间:2018-06-18 03:13:18

标签: git gitignore inotify inotifywait

我试图在除.gitignore之外的文件夹中监听文件更改以触发重建。

似乎使用带有--exclude选项的inotifywait是正确的方法。有没有人知道将.gitignore转换为正则表达式的好方法,以便inotifywait --exclude可以正确接受?

只要有效,我也会对其他解决方案持开放态度。

感谢。

2 个答案:

答案 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

GitHub upstream

如果您是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跟踪以自动包含.gitHow to tell if a file is git tracked (by shell exit code)?,但是这种方法更好,因为它甚至在开始测试新文件之前就使用了它们跟踪。