自动导出 Git 变更文件,一个 .bat 脚本搞定
·
“家人们谁懂啊!每次上线都要手动找改了哪些文件,眼睛都看瞎了!”
今天分享一个我自己用的 Windows 小工具,跑了几个月没出问题,希望能帮到你~
🌟 起因:不想再手动画圈复制文件了
有次要打包从某个 Git 提交开始改过的所有前端文件,发给测试同事。
我打开 Git GUI,一个个点、复制路径、建文件夹、粘贴……
11个文件花了快半小时,还漏了一个!😭
心想:这活儿明明可以交给电脑干啊!
于是,我写了这个 .bat 脚本,现在每次双击一下,5秒搞定。
🔧 它是怎么工作的?(超简单逻辑)
脚本就做三件事:
- 问 Git:“从这个提交(比如
a1b2c3d...)到现在,哪些文件变了?” - 按原样建目录:比如文件在
src/views/home.vue,就在目标文件夹里也建src\views\。 - 把文件内容原封不动拷过去——不是建空文件哦!
⚠️ 我踩过的坑 & 怎么绕过去的
❌ 坑1:中文乱码 or 脚本跑不起来
一开始变量名用了中文,结果在某些电脑上直接报错。
后来发现:Windows 批处理对中文变量支持不稳定。
✅ 改法:
- 变量名全用英文(比如
START_COMMIT) - 中文只写在注释里(人看得懂就行)
- 脚本保存时选 ANSI 编码(用记事本“另存为”就能选)
❌ 坑2:路径斜杠不对
Git 给的路径是 src/app.vue(用 /),但 Windows 的 copy 命令只认 src\app.vue(用 \)。
结果:脚本说“复制成功”,实际目标文件是空的!
✅ 改法:加一行自动转换:
set "SOURCE_PATH=!SOURCE_PATH:/=\!"
这句的意思:把路径里的
/全部换成\
❌ 坑3:漏掉起始提交的文件!
最开始我写的是 A..HEAD,结果 commit A 自己改的文件没包含进去!
✅ 改法:改成 A~1..HEAD
因为
A~1是 A 的“爸爸提交”,所以A~1..HEAD= 从 A 开始(含)到最新
✨ 脚本代码(带详细注释)
@echo off
setlocal enabledelayedexpansion
:: 检查是不是在 Git 仓库里运行
git rev-parse --git-dir >nul 2>&1
if errorlevel 1 (
echo 错误:请把这个脚本放在你的项目根目录下运行!
pause
exit /b 1
)
:: ========== 你只需要改下面这两行 ==========
set "START_COMMIT=a1b2c3d4e5f67890..." :: ← 把这里换成你的 commit ID
set "EXPORT_DIR=D:\打包输出文件夹" :: ← 把这里换成你想保存的位置
:: =========================================
echo 使用的起始提交: %START_COMMIT%
echo 文件将导出到: %EXPORT_DIR%
:: 如果目标文件夹不存在,就创建它
if not exist "%EXPORT_DIR%" mkdir "%EXPORT_DIR%"
:: 让 Git 列出从 START_COMMIT(含)到 HEAD 的所有变更文件
set "TEMP_FILE=%TEMP%\git_changed_files.txt"
git diff --name-only "%START_COMMIT%~1" HEAD > "%TEMP_FILE%"
:: 逐个复制文件
set "COUNT=0"
for /f "usebackq tokens=* eol=:" %%f in ("%TEMP_FILE%") do (
if "%%f" neq "" (
:: 把 Git 的 / 路径转成 Windows 的 \
set "SRC=%%f"
set "SRC=!SRC:/=\!"
:: 如果源文件存在,就复制
if exist "!SRC!" (
set "TARGET=%EXPORT_DIR%\!SRC!"
:: 自动创建目标文件的父目录
for %%d in ("!TARGET!") do mkdir "%%~dpd" 2>nul
copy "!SRC!" "!TARGET!" >nul
echo [!COUNT!] 已复制: !SRC!
set /a COUNT+=1
)
)
)
:: 清理临时文件
del "%TEMP_FILE%" 2>nul
echo.
echo 共复制 %COUNT% 个文件到 %EXPORT_DIR%
pause
📌 怎么用?(超简单)
前提:你的 Windows 电脑已安装 Git for Windows,并且能在命令提示符(CMD)中直接输入 git 命令。
- 复制上面代码,粘贴到 记事本
- 修改两行:
START_COMMIT=后面换成你的 commit ID(在终端输git log --oneline就能看到)EXPORT_DIR=换成你想保存的路径(支持中文,比如D:\上线包_4月2日)
- 点 文件 → 另存为:
- 文件名:
一键打包.bat - 编码:选 ANSI(重要!)
- 文件名:
- 双击运行!等几秒就完事了~
❤️ 写在最后
这个脚本我用了,自己项目跑着没问题。
但它肯定不是“万能完美”的——不同环境可能有差异,建议先在小项目试一试。
不过,哪怕只帮你省下一次手动复制的时间,也值了!
毕竟,程序员的终极梦想:
让机器干活,我喝茶! 🫖
更多推荐



所有评论(0)