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

inotify:监视除.gitignore中的文件以外的文件更改?,git,gitignore,inotify,inotifywait,Git,Gitignore,Inotify,Inotifywait,我正在尝试侦听除.gitignore之外的文件夹中的文件更改以触发重建 使用inotifywait和--exclude选项似乎是正确的方法。是否有人知道一种将.gitignore转换为regex的好方法,以便inotifywait--exclude可以正确接受?不要试图提前告诉inotifywait,最好通过git check ignore-nv--stdin运行修改后的路径。花更多的时间在gitignore文档上,你就会明白为什么,这些模式来自多个来源,并且它们是上下文敏感的,它们只是停止自动

我正在尝试侦听除.gitignore之外的文件夹中的文件更改以触发重建


使用inotifywait和--exclude选项似乎是正确的方法。是否有人知道一种将.gitignore转换为regex的好方法,以便inotifywait--exclude可以正确接受?

不要试图提前告诉inotifywait,最好通过
git check ignore-nv--stdin运行修改后的路径。花更多的时间在gitignore文档上,你就会明白为什么,这些模式来自多个来源,并且它们是上下文敏感的,它们只是停止自动跟踪,它们不会阻止你专门跟踪某个文件。

下面是一个完整的示例,它监视当前目录中未被gitignore文件的更改,如果任何文件发生更改,则运行
/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
如下所述:

(TODO使用
vim-u NONE
最小化)防止创建
.swp
文件:

理想情况下,我们也会将
--事件移动到,创建
,但在这种情况下,Vim会为每个
:w
生成3个事件,即使我试图关闭所有临时文件(要最小化带有
Vim的示例配置-u NONE
):


你也可以考虑检查文件是否被Git跟踪以自动包含<代码> .git < /C> >:但是这种方法更好,因为它甚至在它们被跟踪之前就使用了你正在测试的新文件。< / P >你听说过像詹金斯这样的连续集成工具吗?这使我省去了大量的写作,很可能是出了故障,代码。

directory events filename: "./" "MOVED_TO" "README.adoc~"
directory events filename: "./" "CREATE" "README.adoc"
directory events filename: "./" "CLOSE_WRITE,CLOSE" "README.adoc"