如果git pull
之类的操作与监视模式下的后台构建(在我的情况下是webpack)同时运行,则由于git
想要的编译锁定文件,它通常会失败覆盖。
我想添加脚本来暂停观察者,而任何git
操作当前正在修改工作目录。这应该是可能的,因为git
本身会检查是否有其他git
同时做某事。
请注意,如果合并正在进行中,我不感兴趣等。如果git
当前正在积极撰写文件,我感兴趣。
答案 0 :(得分:1)
我认为检查是否
可能就足够了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 hook机制更改git
命令本身的行为方式(如果这是您的偏好),您可以对其进行微调以仅影响仅更改索引的内容,例如要运行的内容pre(suspend)和post(resume)commit。可以在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,上面的内容就可以了。
答案 1 :(得分:0)
按照其他答案的建议使用.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;
}
}
}