在Git中使用Winmerge来创建diff文件

kupeojn6  于 2023-03-11  发布在  Git
关注(0)|答案(9)|浏览(144)

有没有办法在git里面使用Winmerge来做Diff?

vtwuwzda

vtwuwzda1#

2015年6月更新,6年后:
如“git mergetool winmerge“中所详述的,一个简单的git config diff.tool winmerge就足够了。
Git 2.5+(Q2,2015)现在已经意识到Winmerge是一个比较或合并工具!
原始答复(2009-2012年)
(管理系统文件,1.6.5,DOS会话)
第一部分(使用winmerge)在“如何使用visual diff程序查看'git diff'输出?”中有描述。

C:\myGitRepo>git config --replace --global diff.tool winmerge
C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --replace --global difftool.prompt false

winmerge.sh存储在PATH的目录部分:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -u -dl "Local" -dr "Remote" "$1" "$2"

(see WinMerge Command-line options

git difftool

现在将启动WinMerge。
如果希望git diff启动WinMerge,只需设置:

set GIT_EXTERNAL_DIFF=winmerge.sh

但真实的的附加值来自于使用同一个diff工具在一个批次中**显示所有差异的能力,而不是按顺序显示它们,迫使您一次关闭一个文件的diff工具窗口。

2012年6月更新(两年半后):

比较目录而不是逐个文件很快将可用:
参见[ANNOUNCE] Git 1.7.11.rc1
git difftool“学习了“--dir-diff“选项以生成外部diff工具,该工具可以在填充两个临时目录后一次比较两个目录层次结构,而不是为每个文件对运行一次外部工具的示例
有关详细信息,请参见“Patch difftool : teach difftool to handle directory diffs"和答案“Directory comparison of Git branches“。
按目录的原始difftool脚本(2009年12月)
正如Seba Illingworth在他的回答中提到的,脚本git-diffall.sh(也放在路径中)可以做到这一点:

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

但这只有在为 n 个文件打开 n 个窗口的情况下才有效(如果您尝试使用WinMerge的-s选项,它将不起作用,因为difftool过早删除了临时文件)
这就是为什么我喜欢GitDiff.bat - power-diffing with GI的方法,它允许您在选择一个文件来检查其内部差异之前,查看具有差异的文件列表。
我已经调整它只使用DOS命令

@echo off

setlocal

if "%1" == "-?" (
    echo GitDiff - enables diffing of file lists, instead of having to serially
    echo diff files without being able to go back to a previous file.
    echo Command-line options are passed through to git diff.
    echo If GIT_FOLDER_DIFF is set, it is used to diff the file lists. Default is windff.
    goto END
)

if "%GIT_DIFF_COPY_FILES%"=="" (
    rd /s /q %TEMP%\GitDiff
    mkdir %TEMP%\GitDiff
    mkdir %TEMP%\GitDiff\old
    mkdir %TEMP%\GitDiff\new

    REM This batch file will be called by git diff. This env var indicates whether it is
    REM being called directly, or inside git diff
    set GIT_DIFF_COPY_FILES=1

    set GIT_DIFF_OLD_FILES=%TEMP%\GitDiff\old
    set GIT_DIFF_NEW_FILES=%TEMP%\GitDiff\new

    set GIT_EXTERNAL_DIFF=%~dp0\GitDiff.bat
    echo Please wait and press q when you see "(END)" printed in reverse color...
    call git diff %*

    if defined GIT_FOLDER_DIFF (
        REM This command using GIT_FOLDER_DIFF just does not work for some reason.
        %GIT_FOLDER_DIFF% %TEMP%\GitDiff\old %TEMP%\GitDiff\new
        goto END
    )

    if exist "%ProgramFiles%\Beyond Compare 2\BC2.exe" (
        set GIT_FOLDER_DIFF="%ProgramFiles%\Beyond Compare 2\BC2.exe"
        "%ProgramFiles%\Beyond Compare 2\BC2.exe" %TEMP%\GitDiff\old %TEMP%\GitDiff\new
        goto END
    )

    "%ProgramFiles(x86)%\WinMerge\WinMergeU.exe" -r -e -dl "Local" -dr "Remote"  %TEMP%\GitDiff\old %TEMP%\GitDiff\new
    goto END
)

REM diff is called by git with 7 parameters:
REM     path old-file old-hex old-mode new-file new-hex new-mode
copy %TEMP%\%~nx2 %GIT_DIFF_OLD_FILES%\%1
copy %5 %GIT_DIFF_NEW_FILES%

:END

它不够健壮,无法处理不同目录中同名的文件,但它让您大致了解了可能的情况:
这里只会打开一个WinMerge,其中包含有内部差异的文件列表。你可以点击你想检查的文件,然后按一个简单的ESC键就可以关闭所有WinMerge-diff会话。

kxe2p93d

kxe2p93d2#

我在两个地方使用第一部分时遇到了问题,并按如下方式进行了修复
1.第二个用于设置winmerge.cmd的命令要求在cmdline上有一个额外的斜杠(在$LOCAL和$REMOTE之前),否则cygwin将替换cmdline中的变量

C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""

1.已将winmerge.sh文件更改为(如果没有此文件,则会出现“正确路径无效”错误)

#!/bin/sh
echo Launching WinMergeU.exe: "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
cxfofazt

cxfofazt3#

我有一个脚本可以在Git配置文件中设置比较和合并工具,并带有适当的参数,而不需要单独的.sh文件。它看起来对我来说工作得很好。

git config --global diff.tool winmerge
git config --global difftool.prompt false
git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""

git config --global merge.tool winmerge
git config --global mergetool.prompt false
git config --global mergetool.winmerge.trustExitCode true
git config --global mergetool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""

注意-整个.cmd部分都用引号括起来,以便参数正确列在.gitconfig中

vshtjzan

vshtjzan4#

未配置:

git difftool --tool winmerge

假设:

  • Winmerge已安装
  • Git for windows从“git version 2.12.0.windows1”或更高版本开始安装(尽管早期版本的git可能已经引入了该命令)。

如果出现以下错误

The diff tool winmerge is not available as 'WinMergeU.exe'

您必须验证.gitconfig中winmerge的路径是否正确。

[difftool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe' -e $LOCAL $REMOTE"
esbemjvw

esbemjvw5#

由于线程变得混乱和分叉,下面是msysgit Git Windows目录列表“--dir-diff”WinMerge方法的合并说明。

步骤1-winmerge.sh在您的路径(例如/home/bin/winmerge.sh)可访问的位置创建一个名为www.example.com的文件,其中包含以下内容。

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -r -ub -dl "Remote" -dr "Local" "$1" "$2"

步骤2-在Git Bash中输入以下命令,命令git使用winmerge.sh作为difftool(这些选项存储在/home/.gitconfig中):

git config --replace --global diff.tool winmerge
git config --replace --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
git config --replace --global difftool.prompt false

第3步-现在你可以在Git Bash中输入以下命令来启动WinMerge diff:

git difftool --dir-diff

第4步-为了更快地访问,请通过将此行添加到主文件夹中的.bashrc来创建此命令的别名(如果文件不存在,则使用此行创建.bashrc文件):

alias diffdir='git difftool --dir-diff'

第5步-现在只需在Git Bash中键入以下命令,就可以快速查看WinMerge中的差异

diffdir
3mpgtkmj

3mpgtkmj6#

在Windows上,您可以这样做:
1)打开.gitconfig文件,它位于你的主目录:c:\用户\用户名.gitconfig
2)添加下面的行。注意winmerge路径两边的单引号:

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e "$LOCAL" "$REMOTE"
[difftool]
    prompt = false
[merge]
    tool = winmerge
[mergetool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" \"$MERGED\" \"$REMOTE\"
[mergetool]
    keepBackup = false
    trustExitCode = false
rpppsulh

rpppsulh7#

我可以在这里看到很多冗长而令人困惑的答案,所以在windows10上发布2021年对我有效的简化和最小版本

git config diff.tool winmerge
 git config --replace --global difftool.prompt false
ldioqlga

ldioqlga8#

我很困惑为什么解决方案以DOS批处理文件的形式出现,因为我的Git安装附带了一个bash shell,我也无法从bash获得DOS上下文,所以我尝试修改以前在bash上下文中共享的内容。
由于git diff似乎对每个文件运行一次指定的命令,因此我将解决方案拆分为两个bash脚本:
首先,将gitprepdiff.sh配置为前面提到的difftool

#!/bin/sh
#echo ...gitprepdiff.sh
cp -v $1 "$TMP/GitDiff/old/$2"
cp -v $2 "$TMP/GitDiff/new"

我还注意到,可以在C:\Users\<username>\.gitconfigure中直接找到和编辑git configure命令的结果
然后在命令行中运行gitdiff.sh,您通常会在命令行中调用git diff

#!/bin/sh
#echo Running gitdiff.sh...

DIFFTEMP=$TMP/GitDiff

echo Deleting and re-creating $DIFFTEMP...
rm -rf $DIFFTEMP;
mkdir $DIFFTEMP;

echo Creating $DIFFTEMP/old...
mkdir $DIFFTEMP/old;

echo Creating $DIFFTEMP/new...
mkdir $DIFFTEMP/new;

git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename";
done

"$PROGRAMFILES\WinMerge\WinMergeU.exe" -r -e -dl "Repository" -dr "Working" $LOCALAPPDATA\\Temp\\1\\GitDiff\\old $LOCALAPPDATA\\Temp\\1\\GitDiff\\new

另外值得注意的是,在我的安装中,/tmp(在bash中)Map到%LOCALAPPDATA%\Temp\1\(在Windows中),所以这就是为什么我在调用WinMerge时使用后者。

iih3973s

iih3973s9#

git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "\"$PROGRAMFILES\\WinMerge\\WinMergeU.exe\" -u -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""
git config --global difftool.prompt false

根据WinMerge command line manual:“参数前缀为正斜杠(/)或破折号(-)字符”

相关问题