当前位置:  开发笔记 > 编程语言 > 正文

在Git中使用Winmerge来编写diff

如何解决《在Git中使用Winmerge来编写diff》经验,为你挑选了4个好方法。

有没有办法在git中使用Winmerge来做Diffs?



1> VonC..:

2015年6月更新,6年后:

正如" git mergetool winmerge "中详述的那样,简单git config diff.tool winmerge就足够了.

Git 2.5+(2015年第2季度)现在已经将Winmerge视为差异或合并工具!


原答案(2009-2012)

(msysgit,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"

(请参阅WinMerge命令行选项)

git difftool

现在将启动WinMerge.
如果要git diff启动WinMerge,只需设置:

set GIT_EXTERNAL_DIFF=winmerge.sh

但真正的附加价值来自于使用相同的差异工具在一个批次中呈现所有差异而不是按顺序呈现它们的能力,迫使您一次关闭一个文件的差异工具窗口.

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

比较目录而不是逐个文件将很快可用:
参见[ANNOUNCE] Git 1.7.11.rc1:

" git difftool"学会了" --dir-diff"选项来生成外部差异工具,这些工具可以在填充两个临时目录后一次比较两个目录层次结构,而不是每个文件对运行一次外部工具实例.

有关更多详细信息,请参阅" 修补程序difftool:教授difftool处理目录差异 "和答案" Git分支的目录比较 ".


目录脚本的原始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 的选项,它将无法工作,因为过早地被difftool删除了临时文件)-s


这就是为什么我喜欢GitDiff.bat的方法- 使用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会话.



2> 小智..:

我在2个地方使用第一部分时遇到了麻烦,并修复如下

    设置winmerge.cmd的第二个命令需要在cmdline上添加一个额外的斜杠(在$ LOCAL和$ REMOTE之前),否则cygwin将替换cmdline中的变量

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

    将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")"
    


我完全按照VonC的指示,但是我在winmerge.sh脚本中收到了空参数.使用额外的斜杠解决了这个问题.谢谢!

3> robertcollie..:

由于线程变得混乱和分叉,这里是msysgit Git Windows的目录列表"--dir-diff"WinMerge方法的合并说明.

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

#!/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



4> Alf47..:

我有一个脚本,它将使用适当的参数设置Git配置中的Diff和Merge工具,这些参数不需要单独的.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中

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有