如何判断git操作是否正在进行中?

问题描述 投票:2回答:2

如果像git pull这样的操作与监视模式下的后台构建(在我的情况下是webpack)同时运行,那么由于git想要覆盖的编译锁定文件,它经常会失败。

我想添加脚本来暂停观察者,而任何git操作当前正在修改工作目录。这应该是可能的,因为git本身检查是否没有其他git同时做某事。

请注意,如果合并正在进行中,我不感兴趣等。如果git目前正在积极编写文件,我感兴趣。

git version-control
2个回答
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命令本身的行为方式,如果这是你的偏好,通过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它可以正常工作。


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;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.