【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)
  • 104857600是100 * 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=等待用户输入。

小结

  • 目前本脚本可以勉勉强强支持正常个人仓库的使用
  • 如有错误,欢迎指出
  • 感谢观看!
相关推荐
梅孔立12 分钟前
Windows PowerShell 升级 Pi-Coding-Agent + OpenCode,解决 OpenCode 二进制无效报错
windows
网络毒刘2 小时前
开源 Aider 工作流实战:Git 提交驱动的 AI 结对,与 Cursor 何时互补
git·ai编程·cursor·aider
东木月2 小时前
Windows C 盘清理指南:安全删除临时文件、缓存与 Prefetch
c语言·windows·安全
ly76893 小时前
Elasticsearch 写入链路的 refresh、flush 与 translog 边界:为什么 bulk 吞吐会突然塌陷
大数据·elasticsearch·搜索引擎·translog·写入链路·bulk调优
水饺编程3 小时前
第1章,[Win32 章节]:Windows 的方方面面
c语言·c++·windows·visual studio
Elasticsearch4 小时前
AWS 自动化根因分析:从 CloudWatch 告警到完成故障诊断,仅需 36 秒
elasticsearch
超级大福宝4 小时前
VS Code Remote-SSH 因 RemoteForward 端口冲突导致连接失败的排查与解决
运维·服务器·windows·vscode·ssh
HRTOS4 小时前
HRTOS 4.0 将长期维护:为什么版本号不再频繁变化
经验分享·git·单片机·51单片机
Vex2une4 小时前
Windows PowerShell 发展史:从命令行工具到自动化核心
windows·自动化运维·命令行·powershell·cmd·脚本语言·对象管道
欢醉5 小时前
基于日志的监控告警:我们是怎么用一套轻量方案把线上问题"盯"住的
elasticsearch·springcloud·日志