多个差异工具

moe*_*oey 15 git configuration

我建立了我的混帐使用P4Merge作为比较工具,如所描述这里.所以,git diff会触发P4Merge.

但是,有时我发现使用UNIX diff更快更有效(因为没有涉及GUI).如何设置git以便我可以轻松选择我想要触发的差异工具?这可能吗?例如:

$ git diff     # to trigger P4Merge
$ git difftool # to trigger UNIX diff
Run Code Online (Sandbox Code Playgroud)

我的git config --list:

code.editor=vi
merge.tool=p4merge
mergetool.extMerge.cmd=extMerge $BASE $LOCAL $REMOTE $MERGED
mergetool.extMerge.trustexitcode=false
diff.external=extDiff
mergetool.prompt=false
mergetool.keepbackup=false
mergetool.p4merge.path=/usr/local/bin/p4merge
Run Code Online (Sandbox Code Playgroud)

DrS*_*ork 7

您可以明确指出要使用哪个 difftool。我有这个~/.gitconfig

[diff]
    tool = vimdiff

[difftool "winmerge"]
    name = WinMerge
    trustExitCode = true
    cmd = "/c/Users/rkasten/Google\\ Drive/Apps/WinMerge/WinMergeU.exe" -u -e $LOCAL $REMOTE
Run Code Online (Sandbox Code Playgroud)

然后我有以下别名设置:

alias gdt='git difftool'
alias gdtw='git difftool --tool=winmerge'
Run Code Online (Sandbox Code Playgroud)

使用 masukomi 的示例,您可以将以下内容添加到您的 gitconfig 中:

[difftool "Kaleidoscope"]
    cmd = ksdiff --whatevs
Run Code Online (Sandbox Code Playgroud)

并用于alias gdtk='git difftool --tool=Kaleidoscope'使用万花筒。

所有这些都适用于 git 2.7。


App*_*pak 5

更新: 如果你想要git difftool调用默认的diff功能而不是外部工具,那么这个答案结尾处的简单版本就可以了.但是,如果您只想要多个diff工具,我更喜欢和推荐的方法是.sitconfig文件方法,如DrStrangeprok的答案中所述.


您可以将以下bash脚本设置为外部编辑工具.
(即:用它替换extDiff的内容)
它不像git diif1/git diff2那么简单,但它有效.

编辑:请参阅底部以获得更简单的版本

#!/bin/bash

# Parameters from git:
# 1    2        3       4        5        6       7
# path old-file old-hex old-mode new-file new-hex new-mode

CONTINUE=1
while [ $CONTINUE == 1 ]
do

    # Present Options
    echo "1. P4Merge"
    echo "2. Unix diff"
    echo "3. Cancel"
    echo -n "Choose diff tool[1]: "

    # Read in user choice
    read -n 1 OPTION

    # move down a line
    echo ""

    # if user didn't enter a choice default to 1
    if [[ $OPTION == "" ]] ; then
        OPTION="1"
    fi

    # Launch diff tool based on OPTION
    case $OPTION in
        1) /Applications/p4merge.app/Contents/MacOS/p4merge "$2" "$5" ; CONTINUE=0 ;;
        2) diff "$2" "$5" ; CONTINUE=0 ;;
        3) exit ;;
        *) echo "\"$OPTION\" is not valid " ;;
    esac


    # This sleep has two purposes
    # 1) on an invalid choice it delays the menu just a hair
    # 2) keeps this script alive long enough that git will not just move onto the next file
    #    instantly if diffing multiple files.
    sleep 1

done
Run Code Online (Sandbox Code Playgroud)

没有菜单的简单版本
将此函数添加到.bashrc如果使用'git difftool'则会使用默认的diff

function git {

    if [[ $1 == "difftool" ]] ; then
        git config --global --unset diff.external
        command git diff
        git config --global diff.external extDiff
    else
        command git "$@"
    fi

}
Run Code Online (Sandbox Code Playgroud)


mas*_*omi 5

Git可以轻松管理视觉差异和命令行差异。无需花哨的调整

git diff(默认情况下)使用unix diff

如果您还想使用视觉差异工具来设置它,则正确的方法是在~/.gitconfig文件中包含以下部分:

[difftool "Kaleidoscope"]
    cmd = ksdiff --partial-changeset --relative-path \"$MERGED\" -- \"$LOCAL\" \"$REMOTE\"
Run Code Online (Sandbox Code Playgroud)

之后的cmd =内容特定于您的特定视觉差异应用程序。

这是不是标准的做法,操纵git diff发送内容到可视版本比较的应用程序。因此,该问题寻求的答案比内置功能落后100%。

有关更多详细信息,请参见git-difftool手册页