git自动同步脚本(Windows)
之前在Windows Server 2019环境下,每次同步仓库都要手动拉取,并且每次也只是些小改动,我觉得有必要搞一个自动化脚本来拉取但我发现网上的教程大部分都是Linux环境下的,问了朋友也>发现他只写了Linux环境下的脚本,因此我用Deepseek V4 Pro写了这么一个脚本
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
:: ==================== 配置区域 ====================
set "REPO_PATH=YOUR PATH"
set "REMOTE_URL=YOUR URL"
set "BRANCH=YOUR BREACH"
set "INTERVAL_SECONDS=60"
set "PRIVATE_KEY=YOUR KEY"
set "MAX_LOG_SIZE=10485760"
:: =================================================
:: 临时开启调试输出(显示每条命令)
:: 如果不需要,可以注释掉下面一行
@echo on
:: 设置 Git SSH 命令(注意路径中的反斜杠转义)
set "KEY_PATH_UNIX=/c/Users/ADFG/testrm"
set "GIT_SSH_COMMAND=ssh -i %KEY_PATH_UNIX% -p 2223 -o IdentitiesOnly=yes -o StrictHostKeyChecking=no"
:: 将 Git 所在目录临时加入 PATH(根据你的安装路径修改)
set "PATH=C:\Program Files\Git\bin;C:\Program Files\Git\usr\bin;%PATH%"
:: 日志文件
set "LOG_FILE=%~dp0auto_git_pull.log"
:: 检查私钥是否存在
if not exist "%PRIVATE_KEY%" (
echo [错误] 私钥文件不存在: %PRIVATE_KEY%
echo 请确认路径后按任意键退出...
pause
exit /b 1
)
:: 初始化日志(如果日志文件大于10MB则清空)
if exist "%LOG_FILE%" (
for %%A in ("%LOG_FILE%") do set "size=%%~zA"
if defined size if !size! GEQ %MAX_LOG_SIZE% (
echo [%date% %time%] 日志超过%MAX_LOG_SIZE%字节,清空 >> "%LOG_FILE%"
type nul > "%LOG_FILE%"
)
) else (
echo [%date% %time%] ========== 自动拉取脚本启动 (SSH) ========== > "%LOG_FILE%"
echo [%date% %time%] 仓库路径: %REPO_PATH% >> "%LOG_FILE%"
echo [%date% %time%] 远程地址: %REMOTE_URL% >> "%LOG_FILE%"
echo [%date% %time%] 分支: %BRANCH% >> "%LOG_FILE%"
echo [%date% %time%] 私钥: %PRIVATE_KEY% >> "%LOG_FILE%"
echo [%date% %time%] 间隔: %INTERVAL_SECONDS% 秒 >> "%LOG_FILE%"
echo ---------------------------------------------- >> "%LOG_FILE%"
)
:: 检查 Git 是否可用
where git >nul 2>&1
if errorlevel 1 (
echo [错误] 未找到 git 命令,请先安装 Git 或检查 PATH。
pause
exit /b 1
)
:: 如果本地仓库目录不存在则克隆
if not exist "%REPO_PATH%\.git" (
echo [%date% %time%] 本地仓库不存在,正在克隆... >> "%LOG_FILE%"
git clone "%REMOTE_URL%" "%REPO_PATH%" >> "%LOG_FILE%" 2>&1
if errorlevel 1 (
echo [错误] 克隆失败,请检查网络和密钥。
pause
exit /b 1
)
)
:loop
:: 进入仓库目录
cd /d "%REPO_PATH%" 2>> "%LOG_FILE%"
if errorlevel 1 (
echo [%date% %time%] [错误] 无法进入目录 "%REPO_PATH%" >> "%LOG_FILE%"
echo 请确认路径是否正确,按任意键退出...
pause
exit /b 1
)
:: 确保远程 origin 存在且 URL 正确
call :ensure_remote_origin
if errorlevel 1 goto :wait
:: 确保当前分支是 master
git rev-parse --abbrev-ref HEAD > "%TEMP%\cur_branch.txt"
set /p CUR_BRANCH=<"%TEMP%\cur_branch.txt"
del "%TEMP%\cur_branch.txt"
if not "%CUR_BRANCH%"=="%BRANCH%" (
echo [%date% %time%] 当前分支 %CUR_BRANCH%,切换到 %BRANCH%... >> "%LOG_FILE%"
git checkout %BRANCH% >> "%LOG_FILE%" 2>&1
if errorlevel 1 (
git checkout -b %BRANCH% origin/%BRANCH% >> "%LOG_FILE%" 2>&1
)
)
:: 设置上游跟踪
call :set_upstream
:: 执行拉取
echo [%date% %time%] git pull ... >> "%LOG_FILE%"
git pull >> "%LOG_FILE%" 2>&1
if errorlevel 1 (
echo [%date% %time%] [警告] pull 失败,尝试 git pull origin %BRANCH% >> "%LOG_FILE%"
git pull origin %BRANCH% >> "%LOG_FILE%" 2>&1
)
echo [%date% %time%] 等待 %INTERVAL_SECONDS% 秒... >> "%LOG_FILE%"
echo ---------------------------------------------- >> "%LOG_FILE%"
ping -n %INTERVAL_SECONDS% 127.0.0.1 >nul
goto :loop
:: ------------------------------------------------------------
:ensure_remote_origin
git remote get-url origin >nul 2>&1
if errorlevel 1 (
echo [%date% %time%] 添加远程 origin ... >> "%LOG_FILE%"
git remote add origin "%REMOTE_URL%" >> "%LOG_FILE%" 2>&1
if errorlevel 1 (
echo [%date% %time%] 添加失败 >> "%LOG_FILE%"
exit /b 1
)
) else (
for /f "usebackq delims=" %%i in (`git remote get-url origin`) do set "CURRENT_URL=%%i"
if not "!CURRENT_URL!"=="%REMOTE_URL%" (
echo [%date% %time%] 更新远程 URL ... >> "%LOG_FILE%"
git remote set-url origin "%REMOTE_URL%" >> "%LOG_FILE%" 2>&1
)
)
exit /b 0
:set_upstream
git rev-parse --abbrev-ref --symbolic-full-name @{u} >nul 2>&1
if errorlevel 1 (
echo [%date% %time%] 设置上游跟踪 ... >> "%LOG_FILE%"
git branch --set-upstream-to=origin/%BRANCH% %BRANCH% >> "%LOG_FILE%" 2>&1
)
exit /b 0
注意把
YOUR URL替换成正确的url或者ssh地址,YOUR KEY需要给出公钥的绝对路径,YOUR BREACH就是分支,YOUR PATH就是要拉取的文件夹,也是绝对路径,把这个保存为bat文件就能运行了,记得挂在后台别叉掉,时间是1分钟同步一次,每次同步成功都会写入log文件,如果出错也能以此来排查,如果是SSH连接记得要在本地先生成好公钥和私钥