git - 配置多个 git mergetool 和 difftool 以便根据扩展选择合适的工具

标签 git git-diff rhapsody git-difftool

当我执行 git difftool 时,它会递归地为所有文件运行默认 difftool。我编写了一个脚本来根据扩展名选择适当的 difftool,并在脚本中调用 git difftool -t mytool 。 difftool 将所有参数重定向到新调用,这很好。但是,它也会以某种方式重定向所有文件名。所以基本上,我的脚本变得毫无用处,因为自定义 difftool 与所有更改的文件一起传递。

我想要做的是,将 difftool 限制为一个文件,或者至少使用一个文件调用我的 difftool,而不是其余的。基本上,这是我的脚本,我将其作为 .gitconfig 中的默认 difftool。

if is_sbs $1 $2 ; then
    #custom difftool which is also defined in .gitconfig
    git dt -t rhapsody 
else
    #for all files
    git dt -t kdiff3 
fi

最佳答案

显然,git 本质上通过管道传输所有文件信息,并且它不会显示在脚本的参数中。我没有将其他 diff 工具定义为 .gitconfig 中的“difftool”,而是使用适当的参数调用了可执行文件。完整的解决方案如下:

.gitconfig

[difftool]
    prompt = false
[mergetool]
    prompt = false
[difftool "selectiveDiff"]
    cmd = difftool.sh $LOCAL $REMOTE $BASE $MERGED
    keepBackup = false
[mergetool "selectiveMerge"]
    cmd = mergetool.sh $LOCAL $REMOTE $BASE $MERGED
    keepBackup = false

请记住,脚本应位于 PATH 中。创建一个目录并将其添加到您的 PATH 中,或者使用 PATH 中已有的目录。

在某处定义变量

RHAPSODY_PATH="C:/Program Files (x86)/IBM/Rational/Rhapsody/8.0.5/DiffMerge.exe"
KDIFF3_PATH="C:/Program Files/KDiff3/kdiff3.exe"

difftool.sh

if is_sbs $1 $2 ; then
    "$RHAPSODY_PATH" -base $3 $1 $2 -xcompare 
else
    "$KDIFF3_PATH" $1 $2
fi

mergetool.sh

if is_sbs $1 $2 ; then
    #DiffMerge.exe -base BASE FILE1 FILE2 -out OUTPUT -xmerge
    "$RHAPSODY_PATH" -base $3 $1 $2 -out $4 -xmerge
else
    #kdiff3 BASE FILE1 FILE2 -o OUTPUT
    "$KDIFF3_PATH" $3 $1 $2 -o $4
fi

它将在调用时选择正确的差异和 merge 工具。

关于git - 配置多个 git mergetool 和 difftool 以便根据扩展选择合适的工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25069455/

相关文章:

git - checkin 应该是小步骤还是完整的功能?

java - 使用 JGit 提交之间更改的文件列表

java - Rhapsody API 重新加载项目

java - 当我使用 Java API 从插件打印时,IBM Rhapsody 日志为空

git - 克隆裸 git 存储库的单个路径

git svn rebase 索引文件打开失败 : Invalid argument

git - 为什么 `git diff` 报告 `git add` 之后没有文件更改

git - 'git diff' 可以只输出长行中的更改吗?

embedded - 您对 Rhapsody 开发的审核流程是什么?

git - 如何将图像添加到 Stash 中的自述文件