如果像git pull
这样的操作与监视模式下的后台构建(在我的情况下是webpack)同时运行,那么由于git
想要覆盖的编译锁定文件,它经常会失败。
我想添加脚本来暂停观察者,而任何git
操作当前正在修改工作目录。这应该是可能的,因为git
本身检查是否没有其他git
同时做某事。
请注意,如果合并正在进行中,我不感兴趣等。如果git
目前正在积极编写文件,我感兴趣。
我认为检查是否足够
yourepo/.git/index.lock
存在,当它不创建它时,运行一点,删除它,睡一会儿,然后重复。我认为如果后台程序真的不断运行,这是很昂贵的。它有时也会阻止你工作直到睡觉。
一个可行的选择是自己包装git
命令。纯粹在bash中,函数可以:
function mygit {
pid=$(ps -eo pid,comm a | grep webpack)
pid=${pid%% *}
kill -TSTP $pid
git $*
kill -CONT $pid
}
运行mygit
会暂停你的进程,运行git,然后让它继续。你也可以改变git
命令本身的行为方式,如果这是你的偏好,通过git hook机制,你可以微调,只影响只改变索引的东西,比如运行pre(暂停)和post(恢复)提交。可以在https://coderwall.com/p/jp7d5q/create-a-global-git-commit-hook中找到初始化这个的教程 - 基本上它只是在指定目录中具有特定名称的脚本。
编辑
在回顾下面的评论后,我想补充一点,git-hook
解决方案在Windows上是完全可行的,因为git
在Windows上附带了它自己的bash。关于如何执行此操作的教程是https://tygertec.com/git-hooks-practical-uses-windows/,但请确保脚本都是bash,以上任何内容都可以。唯一需要注意的是找到并暂停PID。
taskkill //PID <num>
会杀了它,我不知道如何暂停。也许在Windows 10上使用bash它可以正常工作。
通过使用其他答案建议的.git/index.lock
,我最终修改了我的构建脚本,以便等待删除此文件并在构建期间自行创建它,以便在构建期间也无法启动git。
发布以防JavaScript代码也证明对其他人有用。
const gitIndexLock = path.join(__dirname, "..", ".git", "index.lock");
let hasWrittenOwnGitIndexLock = false;
function lockParallelGitOperations(callback) {
if (!fs.existsSync(gitIndexLock) || hasWrittenOwnGitIndexLock) {
writeLockFile();
callback();
return;
}
console.log("Git operation in progress... Waiting...");
const sleepStarted = Date.now();
sleep();
function sleep() {
setTimeout(() => {
if (fs.existsSync(gitIndexLock)) {
if (Date.now() - sleepStarted > 30000) {
console.log("Git has been locked for over 30 seconds. Removing foreign lock...");
fs.unlinkSync(gitIndexLock);
} else {
sleep();
return;
}
}
writeLockFile();
callback();
}, 200);
}
function writeLockFile() {
if (!hasWrittenOwnGitIndexLock) {
console.log("Creating .git/index.lock.");
fs.writeFileSync(gitIndexLock, "");
hasWrittenOwnGitIndexLock = true;
}
}
}