【git一键push脚本】基于Windows bat脚本的一键git提交脚本

前言

  • 最近天天在仓库提交东西,于是整了一个一键推送脚本,这里也分享一下。
  • 本脚本仅适用于单人仓库,且已经安装git的情况下。

1 完整代码实现

1-1 完整代码
  • 先上完整代码我再分析
bat 复制代码
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion

echo ===============================
echo        Git 一键Push脚本
echo ===============================

echo.
echo [1/4] 检查 Git 状态...

git status -sb

echo.
echo [2/4] 检查远程更新

git fetch --quiet

for /f %%i in ('git rev-list --left-right --count HEAD...@{u} 2^>nul') do set status=%%i

if defined status (
    for /f "tokens=1,2" %%a in ("!status!") do (
        set behind=%%a
        set ahead=%%b
    )
) else (
    set behind=0
    set ahead=0
)

echo 本地领先: !ahead!
echo 本地落后: !behind!

if !behind! GTR 0 (
    echo WARNING!警告:远程有更新,建议先 pull!
)

echo.
echo [3/4] 检查本次变更是否存在 >100MB 文件(已剔除.gitgnore)

rem 获取变更文件(已暂存 + 未暂存)
git diff --name-only
git diff --cached --name-only
git ls-files --others --exclude-standard > .git_new_files.tmp

(
    git diff --name-only
    git diff --cached --name-only
    type .git_new_files.tmp
) > .git_changed_files.tmp

rem 去重处理(简单方式)
for /f "delims=" %%f in (.git_changed_files.tmp) do (
    if exist "%%f" (
        for %%A in ("%%f") do (
            set size=%%~zA
            if !size! GTR 104857600 (
                echo ERROR!! 超大文件: %%f
                echo    size: !size! bytes
                del .git_changed_files.tmp >nul 2>&1
                del .git_new_files.tmp >nul 2>&1
                pause
                exit /b 1
            )
        )
    )
)

del .git_changed_files.tmp >nul 2>&1
del .git_new_files.tmp >nul 2>&1

echo 未发现本次变更中的超大文件

echo.
echo [4/4] git add .
git add .

echo.
set /p msg=请输入本次的 commit message: 

if "%msg%"=="" (
    echo ERROR!! commit message 不能为空
    pause
    exit /b 1
)

git commit -m "%msg%"

if errorlevel 1 (
    echo ERROR!! commit 失败
    pause
    exit /b 1
)

echo.
echo 正在 push...

git push

if errorlevel 1 (
    echo ERROR!! push 失败(可能冲突或权限问题)
    pause
    exit /b 1
)

echo.
echo ===============================
echo Push 成功!
echo ===============================
pause

1-2 完整流程
  • 整个脚本就完成以下几个流程:
  1. 检查仓库状态
  2. 检查远程更新风险
  3. 检查本次变更是否有 >100MB 文件 (需要考虑.gitgnore,且每次只检测本轮新增的内容)
  4. git add .
  5. 根据用户输入信息进行git commit
  6. git push

1-3 测试

2 代码解析

  • 整体没啥难的就快速过一遍
2-1 初始化
bat 复制代码
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
  • 关闭bat脚本的执行命令前缀C:\xxx>命令
  • 切换控制台编码为 UTF-8防止中文乱码
  • 延迟变量展开,确保普通变量%var%会在for循环中实时更新

2-2 检查 Git 状态
bat 复制代码
git status -sb
  • -s简洁输出,-b当前分支

2-3 远程更新
2-3-1 同步信息
bat 复制代码
git fetch --quiet
  • 同步远程信息但不执行修改,--quiet静默模式

2-3-2 对比分支
bat 复制代码
git rev-list --left-right --count HEAD...@{u}
  • HEAD当前本地分支
  • .@{u}远程分支,一般是origin/main
  • ...进行比较,比较远程和本地的commit
  • --left-right区分左右
  • --count只输出数量。

bat 复制代码
for /f %%i in ('git rev-list --left-right --count HEAD...@{u} 2^>nul') do set status=%%i

if defined status (
    for /f "tokens=1,2" %%a in ("!status!") do (
        set behind=%%a
        set ahead=%%b
    )
) else (
    set behind=0
    set ahead=0
)
echo 本地领先: !ahead!
echo 本地落后: !behind!
  • 读取命令输出,然后拆分赋值变量

bat 复制代码
if !behind! GTR 0 (
    echo WARNING!警告:远程有更新,建议先 pull!
)
  • 如果远程更新比本地多,就警告

2-4 大文件检测
2-4-1 获取本次所有变更文件
bat 复制代码
git ls-files --others --exclude-standard
  • 获取未tracked文件但自动遵守.gitignore(这很重要否则这一步会贼慢)
    • --others只看未track文件。
    • --exclude-standard考虑.gitignore.git等文件

bat 复制代码
(
    git diff --name-only
    git diff --cached --name-only
    type .git_new_files.tmp
) > .git_changed_files.tmp
  • git diff --name-only获取未暂存文件
  • git diff --cached --name-only获取已暂存文件
  • 并合并到文件列表.git_changed_files.tmp
  • 上述指令将获得本次所有变更文件,考虑到.gitignore.git等文件

2-4-2 遍历检查大小
bat 复制代码
for /f "delims=" %%f in (.git_changed_files.tmp) do (
    if exist "%%f" (
        for %%A in ("%%f") do (
            set size=%%~zA
            if !size! GTR 104857600 (
                echo ERROR!! 超大文件: %%f
                echo    size: !size! bytes
                del .git_changed_files.tmp >nul 2>&1
                del .git_new_files.tmp >nul 2>&1
                pause
                exit /b 1
            )
        )
    )
)
  • 逐行读取文件名。delims=防止空格被截断。
  • if exist "%%f"防止文件被删除
  • for %%A in ("%%f") do (bat 获取文件属性
  • %%~zA获取文件大小(bytes)
  • 104857600100 * 1024 * 1024,也就是100MB
  • 如果有大文件删除临时文件

2-5 三部曲
bat 复制代码
git add .
set /p msg=请输入本次的 commit message: 
if "%msg%"=="" (
    echo ERROR!! commit message 不能为空
    pause
    exit /b 1
)

git commit -m "%msg%"
git push
  • set /p msg=等待用户输入。

小结

  • 目前本脚本可以勉勉强强支持正常个人仓库的使用
  • 如有错误,欢迎指出
  • 感谢观看!
相关推荐
Desenberg1 小时前
【Claude Code】因为中途修改配置路径导致Claude Code 插件安装失败
windows·bug
phltxy1 小时前
Redis 持久化机制
java·redis·git
九皇叔叔1 小时前
Git 首次提交项目
git
递归尽头是星辰1 小时前
跳表为核:串联 Redis、ES 与业务架构的底层思想复用
redis·elasticsearch·跳表·数据结构的应用·中间件底层原理
祁白_2 小时前
跨平台通用危险函数深度解析
linux·windows·笔记·安全·系统命令
牙牙要健康2 小时前
Windows 下为 VSCode 配置 MSVC 编译工具链:从零安装 Build Tools 到完整配置教程
ide·windows·vscode
长沙红胖子Qt2 小时前
关于 sourceTree桥接管理远端svn仓库出现git时区差8小时无法同步 的解决方法
git·svn·时间差·8小时
weelinking2 小时前
2026年三大主流大模型深度对比:GPT-5.5、Claude 4.6与DeepSeek V4谁更值得选择?
java·大数据·人工智能·git·python·gpt·github
海盗12342 小时前
C#中使用MiniExcel 快速入门:读写 .xlsx 文件
开发语言·windows·c#