You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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中配置自定义动作

  1. 打开SourceTree,点击顶部菜单「工具」→「自定义动作」→「添加」
  2. 在配置窗口填写:
    • 名称:比如「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

火山引擎 最新活动