一个简单的命令行工具:根据版本控制系统(Git 或 SVN)在两次提交/版本之间的差异,批量把发生变化的文件复制到指定目录,并输出统计信息(文件总数、各扩展名分布、跳过数等)。
- 支持:Git / SVN
- 平台:Linux / macOS / Windows
- 用途:做差异包、代码审计提取、增量发布素材打包等
-
读取指定 起始 与 结束 提交(或 SVN 修订号)之间的差异文件列表
- Git:
git diff --name-only <start_parent>..\<end>(若start没父提交,自动用空树) - SVN:
svn diff --summarize -r <start-1>:<end>(忽略删除项)
- Git:
-
将这些文件从 当前工作区 复制到指定输出目录(保持原有相对路径层级)
-
输出统计:总文件数、按扩展名分类计数、跳过文件数(不存在/已删)
-
打印起止提交的简要信息与操作完成时间
-
进度提示(每 10 个文件一条)
version_diff_output \
--start <START> \
--end <END> \
--output <OUTPUT_DIR> \
[--repo <REPO_DIR>] \
[--type <git|svn>]| 选项 | 必填 | 说明 | 默认值 |
|---|---|---|---|
-s, --start |
✅ | 起始提交哈希 / 版本号(Git 提交、tag、分支名;SVN 修订号) | — |
-e, --end |
✅ | 结束提交哈希 / 版本号 | — |
-o, --output |
✅ | 输出目录路径(会自动创建子目录) | — |
-r, --repo |
❶ | 仓库路径(含 .git 或可执行 svn 的工作副本) |
. |
-t, --type |
❶ | 版本控制系统类型:git / svn |
git |
❶ 非必填,有默认值。
-
复制来源是你当前工作区中的文件内容,而不是直接从历史对象导出。 👉 如果你希望复制的内容和
end完全一致,请先在仓库中 检出到end:# Git git switch --detach <END> # 或:git checkout <END> # 然后再运行 version_diff_output ...
-
删除项不会被复制:Git/SVN 中被删除的文件会被统计为“跳过”(若路径已不存在)。
-
Git 起始为首次提交 时,工具会自动用“空树”作为起点,拿
<empty_tree>..end计算差异。 -
SVN 以
start-1 : end作为对比区间,并忽略以D(删除)标记的条目。
./version_diff_output -s c8defaec -e 71ef0123 -r '/Volumes/user/JavaProjects/CentralizedSystem/project' -o '/Volumes/user/临时文件/临时同步用'Windows PowerShell 中路径带空格时请使用引号:
"C:\Path With Space\out"
- 请确保本机已安装并可执行相应命令:
git或svn。 - 若你希望复制的文件版本与
end完全一致,请先把工作区切到end(见上文)。 - 对 重命名 的感知取决于底层
diff:当前命令使用--name-only,不会额外启用 Git 的重命名检测参数(-M)。在某些历史中,重命名可能被视作“删除+新增”。 - 已删除/不存在的文件会被跳过并计入“跳过数”,控制台会打印警告。
- 复制需要对源文件有读权限、对输出目录有写权限。