“家人们谁懂啊!每次上线都要手动找改了哪些文件,眼睛都看瞎了!”
今天分享一个我自己用的 Windows 小工具,跑了几个月没出问题,希望能帮到你~


🌟 起因:不想再手动画圈复制文件了

有次要打包从某个 Git 提交开始改过的所有前端文件,发给测试同事。
我打开 Git GUI,一个个点、复制路径、建文件夹、粘贴……
11个文件花了快半小时,还漏了一个!😭

心想:这活儿明明可以交给电脑干啊!

于是,我写了这个 .bat 脚本,现在每次双击一下,5秒搞定。


🔧 它是怎么工作的?(超简单逻辑)

脚本就做三件事:

  1. 问 Git:“从这个提交(比如 a1b2c3d...)到现在,哪些文件变了?”
  2. 按原样建目录:比如文件在 src/views/home.vue,就在目标文件夹里也建 src\views\
  3. 把文件内容原封不动拷过去——不是建空文件哦!

⚠️ 我踩过的坑 & 怎么绕过去的

❌ 坑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 命令。

  1. 复制上面代码,粘贴到 记事本
  2. 修改两行:
    • START_COMMIT= 后面换成你的 commit ID(在终端输 git log --oneline 就能看到)
    • EXPORT_DIR= 换成你想保存的路径(支持中文,比如 D:\上线包_4月2日
  3. 文件 → 另存为
    • 文件名:一键打包.bat
    • 编码:选 ANSI(重要!)
  4. 双击运行!等几秒就完事了~

❤️ 写在最后

这个脚本我用了,自己项目跑着没问题。
但它肯定不是“万能完美”的——不同环境可能有差异,建议先在小项目试一试。

不过,哪怕只帮你省下一次手动复制的时间,也值了!

毕竟,程序员的终极梦想:
让机器干活,我喝茶! 🫖

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐