【问题标题】:Pausing file watchers until git checkout complete暂停文件观察程序直到 git checkout 完成
【发布时间】:2015-01-30 14:57:42
【问题描述】:

git 在开始结账操作时做了什么?它会写出锁定文件还是什么?

我使用 gulp,如果 git 正在执行结帐操作,我希望它“暂停”观察者。

我可以接受可能不得不“重新保存”一些东西来让文件观察器重新启动。

【问题讨论】:

    标签: git gulp git-checkout gulp-watch


    【解决方案1】:

    函数gulp.watch() 返回一个对象,其中包含一个可以调用的end() 方法 - 请参阅glob-watcher 模块中的定义。

    您可以按照以下方式做一些事情:

    var gulp = require('gulp');
    
    function doGitCheckout(callback) {
      console.log('doing checkout...');
      setTimeout(function() {
        console.log('done checkout...');
        callback();
      }, 1000);
    }
    
    var watcher;
    
    gulp.task('watch:start', function() {
      if (!watcher) {
        watcher = gulp.watch('dist/**/*', ['build']);
        console.log('started watcher');
      }
    });
    
    gulp.task('watch:stop', function() {
      if (watcher) {
        watcher.end();
        watcher = null;
        console.log('stopped watcher');
      }
    });
    
    
    gulp.task('git:checkout', ['watch:stop'], function(cb) {
      console.log('isWatching = ' + !!watcher);
    
      // Start the Git checkout...
      doGitCheckout(function() {
        // The Git checkout is finished!
        gulp.start('watch:start', function() {
          cb();
        });
      });
    });
    
    gulp.task('default', ['watch:start', 'git:checkout']);
    

    Gist with this code here

    所以我们在开始观察时保持对观察者对象的引用,并且有一个任务在观察者运行时停止观察者。我们的 Git 任务依赖于 watch:stop 开始,然后启动 Git 检出,并在完成时回调。回调启动任务watch:start,完成后,我们最终触发函数cb,表示git:checkout已经完成!

    另一种方法可能是在监视对象上使用add(pattern)remove(pattern) 将其关闭然后再次打开,而不是销毁对象并重新创建它。

    【讨论】:

    • 太好了!除了我没有从 gulp 脚本中启动 git。 ...而且,gulp 观察者正在启动 gulp 任务,因为 git checkout 正在重写工作副本文件。我正在寻找一种方法来首先检查 git checkout 是否处于活动状态(比如因为可能存在 .git/checkout.lock 文件或类似的东西?)并阻止观察者暂时运行任务,直到 git checkout 完成重写工作副本
    • 有一个锁文件机制——技术细节见this document。但是 Git 并没有使用锁定文件进行基本操作,它看起来好像只用于像 git rebase 这样的较长任务。它也不会停止读取操作,因为它应该保持一致。
    • 如果您可以控制 Git 进程,那么可以让 Gulp 观察程序在套接字上侦听并接受“挂起”和“恢复”消息。您可以在 Git 进程之前发送暂停,然后在完成后恢复。
    • @spiralx 你有没有在任何时候实现你所说的? :)
    猜你喜欢
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    • 2019-11-06
    • 2016-11-10
    • 2010-10-10
    相关资源
    最近更新 更多