多个差异工具

时间:2012-01-27 10:46:11

标签: git configuration

我设置了 git 以使用P4Merge作为差异工具,如here所述。因此,git diff将触发P4Merge。

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

$ git diff     # to trigger P4Merge
$ git difftool # to trigger UNIX diff

我的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

5 个答案:

答案 0 :(得分:5)

<强>更新 如果你喜欢OP,git difftool调用默认的diff功能而不是外部工具,那么这个答案结尾处的简单版本就可以了。但是,如果您只想要多个diff工具,我更喜欢和推荐的方法是DrStrangeprok's answer.

中描述的.gitconfig文件方法

您可以将以下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

没有菜单的简单版本
将此函数添加到.bashrc中 如果您使用'git difftool',那么它将使用默认的差异

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

}

答案 1 :(得分:5)

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

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

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

[difftool "Kaleidoscope"]
    cmd = ksdiff --partial-changeset --relative-path \"$MERGED\" -- \"$LOCAL\" \"$REMOTE\"

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

操纵git diff将内容发送到视觉差异应用程序是标准做法。因此,该问题寻求从内置功能100%倒退的答案。

有关详细信息,请参阅git-difftool man page

答案 2 :(得分:4)

您可以明确指出要使用的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

然后我设置了以下别名:

alias gdt='git difftool'
alias gdtw='git difftool --tool=winmerge'

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

[difftool "Kaleidoscope"]
    cmd = ksdiff --whatevs

使用alias gdtk='git difftool --tool=Kaleidoscope'来使用Kaleidoscope。

所有这些都适用于git 2.7。

答案 3 :(得分:1)

如果Git可以以某种方式为每个设置设置不同的设置,那将是很好的,但如果没有,为了扩展Appak的答案,以下添加到.bashrc可以调用文本diff,opendiff(FileMerge)或P4Merge diff :

function git {
    if [ $1 == "tdiff" ]
    then
        git config --global --unset diff.external
        command git diff
    elif [ $1 == "diff" ]
    then
        git config --global diff.external ~/bin/git-diff-opendiff
        command git diff
    elif [ $1 == "pdiff" ]
    then
        git config --global diff.external ~/bin/git-diff-p4diff
        command git diff
    else
        command git "$@"
    fi
}

并确保您已经设置了正确的git-diff-opendiffgit-diff-p4diff(它们是shell脚本)。

答案 4 :(得分:0)

你写

  

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

所以这个问题的答案应该只是利用git区分基于控制台和gui的diff工具的能力,而不是依赖于编写外部命令。

通过向-g提供git difftool选项,将使用配置的变量diff.guitool而不是diff.tool来读取要使用的差异工具。

[alias]
    d = difftool -g
    dc = difftool
[diff]
    guitool = p4merge
    tool = diff

就是这样。您可以使用p4merge或类似工具git d <file1> <file2>使用git dc <file1> <file2>调用您的gui工具{{1}}。