如何在SourceTree自定义动作中用ExamDiff自动丢弃无差异文件?
解决SourceTree中用ExamDiff验证后自动丢弃无差异文件的自定义动作方案
我完全懂你的痛点——SourceTree里一堆文件标红但实际没改动,手动一个个丢弃太麻烦了。既然自定义动作里用不了外部Diff的$REMOTE和$LOCAL变量,我们可以换个思路:用Git命令获取仓库里的文件版本,再调用ExamDiff对比,根据返回值决定是否丢弃。
步骤1:创建验证并丢弃的脚本
根据你的系统(Windows/Mac)选择对应的脚本,保存成可执行文件:
Windows 批处理脚本(check-and-discard.bat)
@echo off setlocal enabledelayedexpansion :: 获取SourceTree传入的选中文件路径 set "TARGET_FILE=%~1" :: 创建临时文件,存储该文件在HEAD(仓库最新版本)的内容 set "TEMP_HEAD_FILE=%TEMP%\%~n1_head%~x1" git show HEAD:"%TARGET_FILE%" > "%TEMP_HEAD_FILE%" :: 替换成你的ExamDiff实际安装路径 set "EXAMDIFF_EXE=C:\Program Files\ExamDiff Pro\ExamDiff.exe" :: 静默对比两个文件,/q表示不弹出窗口只返回错误码,/m强制内容对比 "%EXAMDIFF_EXE%" /q /m "%TEMP_HEAD_FILE%" "%TARGET_FILE%" :: ExamDiff返回0代表无差异,执行丢弃操作 if %errorlevel% equ 0 ( echo [INFO] No changes detected, discarding: %TARGET_FILE% git checkout -- "%TARGET_FILE%" ) else ( echo [INFO] Changes found, keeping modifications for: %TARGET_FILE% ) :: 清理临时文件 del "%TEMP_HEAD_FILE%" endlocal
Mac Shell 脚本(check-and-discard.sh)
#!/bin/bash TARGET_FILE="$1" TEMP_HEAD_FILE="/tmp/$(basename "$TARGET_FILE")_head_version" # 获取仓库HEAD版本的文件内容到临时文件 git show HEAD:"$TARGET_FILE" > "$TEMP_HEAD_FILE" # 替换成你的ExamDiff Pro Mac版实际路径 EXAMDIFF_EXE="/Applications/ExamDiff Pro.app/Contents/MacOS/ExamDiff Pro" # 静默对比,返回0则无差异 "$EXAMDIFF_EXE" /q /m "$TEMP_HEAD_FILE" "$TARGET_FILE" if [ $? -eq 0 ]; then echo "[INFO] No changes detected, discarding: $TARGET_FILE" git checkout -- "$TARGET_FILE" else echo "[INFO] Changes found, keeping modifications for: $TARGET_FILE" fi # 清理临时文件 rm "$TEMP_HEAD_FILE"
步骤2:在SourceTree中配置自定义动作
- 打开SourceTree,点击顶部菜单「工具」→「自定义动作」→「添加」
- 在配置窗口填写:
- 名称:比如「Discard Unchanged Files (ExamDiff)」
- 描述:通过ExamDiff验证无差异后,自动丢弃文件修改
- 脚本路径:选择你刚才保存的脚本文件
- 参数:输入
$FILE(这是SourceTree自定义动作支持的变量,代表当前选中的单个文件) - 适用范围:选择「文件」
- 可选:勾选「在终端中运行」,方便查看执行日志
步骤3:批量处理优化(可选)
如果需要一次处理多个选中文件,修改脚本支持批量参数:
- Windows批处理:把核心逻辑改成循环处理所有传入的文件:
for %%f in (%*) do ( set "TARGET_FILE=%%f" :: 这里放原脚本里的临时文件创建、对比、丢弃逻辑 ) - Mac Shell脚本:循环处理所有参数:
for TARGET_FILE in "$@"; do :: 这里放原脚本里的临时文件创建、对比、丢弃逻辑 done
关键说明
- 我们用
git show HEAD:"$FILE"获取仓库中该文件的最新版本,替代了外部Diff的$REMOTE变量,工作区文件就是$FILE,对应$LOCAL - ExamDiff的
/q参数让它静默运行,不弹出对比窗口,只返回错误码;/m参数确保对比的是文件内容而非元数据(比如换行符、权限差异) - 测试时先选一个确认无差异的文件执行,确保脚本路径、ExamDiff路径都正确
内容的提问来源于stack exchange,提问作者Kapten-N




