【问题标题】:GIT: how can I watch for local changes in a performant way?GIT:如何以高效的方式观察本地变化?
【发布时间】:2014-07-09 14:18:13
【问题描述】:

简短说明

我想以高效的方式检测本地 git 存储库中的本地更改。这意味着检测哪些文件在本地被修改,以及未版本化的文件。必须提取任何未提交的更改/文件添加。

我的尝试

到目前为止我得到了什么(要点):https://gist.github.com/kevin-smets/02bda148a5330f350e6b

这是一个可以独立运行或作为 git 插件运行的脚本。它所做的基本上如下,每两秒启动一个git status --porcelain,解释它以检查哪些文件被更改。但是,当它运行时,它会持续占用大约 8% 的 CPU。我尝试了git --diff-files 和其他各种命令,但都导致 CPU 使用率很高。 :(

为什么?

我想将此文件列表提供给 grunt watch 进程。目前我的代码库大约有 15k 个文件并且还在增长。观看所有这些文件将变得不可能。我已经应用了一个静态过滤器来限制观看的文件数量,但是每次我想在定义的过滤器之外编辑文件时手动更改它会变得很麻烦。

一个想法

我的一个想法是,IntelliJ / WebStorm(我当前的 IDE)如何监控 GIT 存储库?我尝试进入社区版的源代码,但是,我想不出来:)。 WebStorm 一定有某种方法可以做到这一点,而不会对 CPU 造成负担,它似乎会在 1 秒或更短的超时时间内获取这些更改......即使它们是在 IDE 之外进行的。我想知道 GIT 中是否有一些事件系统,但我找不到任何类似的东西。

感谢阅读

任何帮助,我们都非常感谢!

【问题讨论】:

  • 搜索文件系统挂钩。这允许您设置在文件系统发生更改时执行的操作(在这种情况下是您的 git 命令)
  • 你有没有想过使用github.com/rvoicilas/inotify-tools/wiki之类的东西来监控文件的变化,然后每次检测到变化时,你只需检查git以查看文件是否被跟踪?跨度>

标签: git gruntjs grunt-contrib-watch


【解决方案1】:

我正在使用:

git status -s --porcelain

基准测试

time git status -s --porcelain
#...
real    0m0.078s
user    0m0.032s
sys 0m0.011s

简单:

time git status

#...
real    0m0.182s
user    0m0.075s
sys 0m0.089s

【讨论】:

  • 嗯,这确实有所改善。从 8% 到 5.4%。我想我需要研究文件系统挂钩。我想制作一个通用解决方案(非特定于操作系统),所以只依赖 GIT。然而,这似乎不是一种可能。不过还是感谢您的建议!
【解决方案2】:

我最终选择了Chokidar 来监控我的源文件夹。它现在大约有 20k 个文件,只要我查看文件夹本身并且没有像 **/*.scss 这样的全局,它就像一个魅力。

我自己通过检查文件的扩展名并将其提供给正确的构建目标来过滤文件类型。这样我就从流程中消除了 git。当 Chokidar 通知您文件更改时,您仍然可以运行任何 git 命令,这样就消除了丑陋的任意超时,并且您的 CPU 不会经常被占用。

【讨论】:

    猜你喜欢
    • 2012-07-14
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    相关资源
    最近更新 更多