2015-01-30 15 views
15

Git làm gì khi bắt đầu hoạt động thanh toán? Nó viết ra một tập tin khóa hay cái gì đó?Tạm dừng người xem tệp cho đến khi git checkout hoàn tất

Tôi sử dụng gulp và tôi muốn nó "tạm dừng" người xem nếu git đang tích cực thực hiện một hoạt động thanh toán.

Tôi đồng ý với việc có thể phải "lưu lại" thứ gì đó để đưa trình xem tệp trở lại thiết bị.

Trả lời

6

Hàm gulp.watch() trả về một đối tượng có phương pháp end() bạn có thể gọi - xem định nghĩa trong mô-đun glob-watcher.

Bạn có thể làm một cái gì đó dọc theo những dòng:

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

Vì vậy, chúng tôi giữ một tham chiếu đến đối tượng quan sát khi chúng ta bắt đầu xem, và có một nhiệm vụ để ngăn chặn người quan sát nếu chạy. Nhiệm vụ Git của chúng tôi phụ thuộc vào watch:stop để bắt đầu, và sau đó bắt đầu thanh toán Git, với một cuộc gọi lại khi nó được hoàn thành. Cuộc gọi lại bắt đầu nhiệm vụ watch:start và khi thực hiện xong, cuối cùng chúng tôi sẽ kích hoạt chức năng cb để cho biết rằng git:checkout đã hoàn tất!

Phương án thay thế có thể là sử dụng add(pattern)remove(pattern) trên đối tượng đồng hồ để tắt rồi bật lại thay vì phá hủy đối tượng và tạo lại đối tượng.

+0

Thats tuyệt vời! Ngoại trừ tôi không đá git từ trong kịch bản gulp. ... Và, những người theo dõi gulp đang khởi động các nhiệm vụ gulp vì git checkout đang viết lại các tệp sao chép hoạt động. Tôi đang tìm cách kiểm tra đầu tiên xem liệu thanh toán git có hoạt động không (như có thể là tệp .git/checkout.lock tồn tại hoặc tương tự?) Và ngăn người xem tạm thời chạy tác vụ cho đến khi git checkout kết thúc viết lại bản sao làm việc – enorl76

+0

Cũng có cơ chế tệp khóa - xem [tài liệu này] (https://github.com/git/git/blob/master/Documentation/technical/api-lockfile.txt) để biết chi tiết kỹ thuật. Nhưng Git không sử dụng tệp khóa cho các thao tác cơ bản, có vẻ như nó chỉ được sử dụng cho các tác vụ dài hơn như 'git rebase'. Nó cũng không ngừng hành động đọc, vì nó được cho là để giữ cho mọi thứ nhất quán. – spiralx

+0

Nếu bạn có quyền kiểm soát quá trình Git, thì người xem Gulp có thể nghe trên ổ cắm và chấp nhận thông báo "tạm dừng" và "tiếp tục". Bạn có thể gửi tạm dừng trước khi tiến trình Git, và sau đó tiếp tục sau khi nó được thực hiện. – spiralx

Các vấn đề liên quan