他の回答で示唆されているように.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;
}
}
}
答えはありませんが、Git操作はすべてアトミックであると考えられます。だから、成功するまであなたのスクリプトから抜け出そうとするかもしれません。部分的に破損した引っ張りの危険はないはずです。 –
'git'コマンドをラップする方が意味がありません(おそらくインデックスを変更するものだけでしょうか?)そうでなければ' webpack'は 'index.lock'などのpingを連続して行わなければならず、衝突を防止する。 – kabanus
@TimBiegeleisen - 動作しません。 'git'がファイルを書き込めないというエラーによって' pull'が中断された場合、既に書き込まれている他のファイルは残っています。新しい 'git pull'を実行すると、作業ディレクトリの既存の変更のためにエラーになります。 @kabanus - いくつかのIDEがgit操作(git cliを使用しない)で使用されている場合は動作しません。 –