diff --git a/src/builder/b-mirror.c b/src/builder/b-mirror.c
index 5e4e768..6822da4 100644
--- a/src/builder/b-mirror.c
+++ b/src/builder/b-mirror.c
@@ -43,6 +43,16 @@ static const char * const git_helper_sh =
" REF=$2\n"
" HASH=$3\n"
" MIRROR_PATH=$4\n"
+ " while ! mkdir \"$MIRROR_PATH.lock\" 2>/dev/null; do\n"
+ " echo \"git mirror locked, waiting...\"\n"
+ " sleep 1\n"
+ " done\n"
+ " trap 'rm -rf \"$MIRROR_PATH.lock\"' EXIT\n"
+ " if [ -d \"$MIRROR_PATH/.git\" ]; then\n"
+ " if git -C \"$MIRROR_PATH\" rev-parse -q --verify \"ref-$HASH\" > /dev/null; then\n"
+ " exit 0\n"
+ " fi\n"
+ " fi\n"
" mkdir -p \"$MIRROR_PATH\"\n"
" if [ ! -d \"$MIRROR_PATH/.git\" ]; then\n"
" git init --bare \"$MIRROR_PATH\"\n"
@@ -85,20 +95,39 @@ static const char * const git_helper_bat =
" echo \"REF: !REF!\"\n"
" echo \"HASH: !HASH!\"\n"
" echo \"MIRROR_PATH: !MIRROR_PATH!\"\n"
+ " :lock_wait\n"
+ " mkdir \"!MIRROR_PATH!.lock\" 2>nul\n"
+ " if errorlevel 1 (\n"
+ " echo \"git mirror locked, waiting...\"\n"
+ " timeout /t 1 /nobreak > nul\n"
+ " goto :lock_wait\n"
+ " )\n"
+ " if exist \"!MIRROR_PATH!\\.git\" (\n"
+ " git -C \"!MIRROR_PATH!\" rev-parse -q --verify \"ref-!HASH!\" > nul 2> nul\n"
+ " if exist !MIRROR_PATH!\\.git if not errorlevel 1 (\n"
+ " rmdir \"!MIRROR_PATH!.lock\"\n"
+ " exit /b 0\n"
+ " )\n"
+ " )\n"
" if not exist \"!MIRROR_PATH!\\.\" (\n"
" mkdir \"!MIRROR_PATH!\"\n"
" )\n"
" if not exist \"!MIRROR_PATH!\\.git\" (\n"
" git init --bare \"!MIRROR_PATH!\"\n"
- " if errorlevel 1 exit /b 1\n"
+ " if errorlevel 1 (\n"
+ " rmdir \"!MIRROR_PATH!.lock\"\n"
+ " exit /b 1\n"
+ " )\n"
" )\n"
" set \"REFSPEC=!REF!:ref-!HASH!\"\n"
" echo \"REFSPEC: !REFSPEC!\"\n"
" git -C \"!MIRROR_PATH!\" fetch \"!REMOTE_URL!\" \"!REFSPEC!\" 2>&1\n"
" if !ERRORLEVEL! neq 0 (\n"
" echo \"git fetch failed with errorlevel !ERRORLEVEL!\"\n"
+ " rmdir \"!MIRROR_PATH!.lock\"\n"
" exit /b 1\n"
" )\n"
+ " rmdir \"!MIRROR_PATH!.lock\"\n"
" exit /b 0\n"
")\n"
"if /i \"!OPERATION!\"==\"checkout\" (\n"