2016-05-09 32 views
0

我有一个几乎是这里https://www.npmjs.com/package/gulp-git串联一饮而尽,git的任务

/** 
* Checkout production build branch. 
*/ 
gulp.task('checkout-dist', function(){ 
    git.checkout('dist', function (err) { 
    if (err) throw err; 
    }); 
}); 

/** 
* Checkout pre production build branch. 
*/ 
gulp.task('checkout-stage', function(){ 
    git.checkout('stage', function (err) { 
    if (err) throw err; 
    }); 
}); 

/** 
* Push production build branch. 
*/ 
gulp.task('push-dist', ['checkout-dist'], function(){ 
    git.push('origin', 'dist', {args: " -f"}, function (err) { 
    if (err) throw err; 
    }); 
}); 

/** 
* Push pre production build branch. 
*/ 
gulp.task('push-stage', ['checkout-stage'], function(){ 
    git.push('origin', 'stage', {args: " -f"}, function (err) { 
    if (err) throw err; 
    }); 
}); 

/** 
* Push production and pre production branches. 
*/ 
gulp.task('deploy-remote', ['push-stage', 'push-dist'], function(){ 
    git.checkout('master', function(err) { 
    if (err) throw err; 
    }); 
}); 

的逻辑很简单提供的任务实例复制以下咽,git的任务,检出一个分支,并将它推到原始的遥控器。

当我一饮而尽推阶段或大口推DIST单独运行任务,他们正在工作的罚款。

但我想在同一时间推阶段和DIST所以我创建了一个名为部署的远程新的任务。 这项任务的工作原理,它推提交到原点回购,但在最后与崩溃:

[17:18:56] Starting 'checkout-stage'... 
[17:18:56] Finished 'checkout-stage' after 12 ms 
[17:18:56] Starting 'push-stage'... 
[17:18:56] Finished 'push-stage' after 9.41 ms 
[17:18:56] Starting 'checkout-dist'... 
[17:18:56] Finished 'checkout-dist' after 14 ms 
[17:18:56] Starting 'push-dist'... 
[17:18:56] Finished 'push-dist' after 14 ms 
[17:18:56] Starting 'deploy-remote'... 
[17:18:56] Finished 'deploy-remote' after 12 ms 

gulpfile.js:483 
    if (err) throw err; 
       ^
Error: Command failed: fatal: Unable to create '.git/index.lock': The file already exists. 

If no other git process is currently running, this probably means a 
git process crashed in this repository earlier. Make sure no other git 
process is running and remove the file manually to continue. 

    at ChildProcess.exithandler (child_process.js:658:15) 
    at ChildProcess.emit (events.js:98:17) 
    at maybeClose (child_process.js:766:16) 
    at Socket.<anonymous> (child_process.js:979:11) 
    at Socket.emit (events.js:95:17) 
    at Pipe.close (net.js:466:12) 

应该如何实现这一目标?

回答

2

首先那些混帐操作都是异步的。这意味着你必须通过调用回调函数cb来告诉他们完成的时间。例如:

gulp.task('push-dist', ['checkout-dist'], function(cb) { 
    git.push('origin', 'dist', {args: " -f"}, function (err) { 
    cb(err); 
    }); 
}); 

其次,你不能同时在同一个仓库上运行两个git进程,这就是你正在做的。每个git进程都会创建一个.git/index.lock文件,以防止其他g​​it进程访问同一个存储库。

你必须使用run-sequence运行一个接一个的操作:

var runSequence = require('run-sequence'); 

gulp.task('checkout-master', function(cb) { 
    git.checkout('master', function(err) { 
    cb(err); 
    }); 
}); 

gulp.task('deploy-remote',, function(cb) { 
    runSequence('push-stage', 'push-dist', 'checkout-master', cb); 
}); 
+0

谢谢,不知道运行secuence的包,就像一个魅力 – lapinkoira