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

时间:2017-12-20 08:48:36

标签: git version-control

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

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

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

2 个答案:

答案 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;
        }
    }
}