2012-01-27 45 views
14

我已经将git设置为使用P4Merge作为diff工具,如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 
+0

上面提到的网址*已损坏,请您更新? – realPK 2014-08-15 00:49:58

回答

6

UPDATE: 如果像OP你想git difftool在结束调用默认差异功能,而不是外部工具的那么简单版本这个答案有效。不过我更喜欢和建议,如果你只是想多比较工具,方法是在DrStrangeprok's answer.


您可以设置以下的bash脚本作为外部编辑工具中描述的的.gitconfig文件的方法。
(即:用它替换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 

简单的版本没有菜单
如果你用“混帐difftool”,那么它会使用默认比较添加这个功能,你的.bashrc

function git { 

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

} 
+0

比这更简单吗? :) – moey 2012-01-27 16:52:14

+1

是的,其实我只是想到了另一种更像你想要的方式,我编辑了我的回答 – Appak 2012-01-27 17:21:18

+0

@Appak你可能需要使用'command git“$ @”'来代替,否则'git commit -am'全部完成“'不起作用 – 2012-09-18 13:39:54

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 "[email protected]" 
    fi 
} 

,只是确保你有适当的git-diff-opendiffgit-diff-p4diff已经设置了(他们是shell脚本)。

4

Git可以轻松管理视觉和命令行比较。没有华丽的调整是必需的

git的差异(默认)使用UNIX diff

,如果你想使用一个可视化版本比较工具以及正确的方法来设置它是在你的~/.gitconfig文件,这样的节:

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

随之而来的cmd =后是特定于特定的可视版本比较的应用。

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

查看git-difftool man page了解更多详情。

3

您可以明确指出要使用哪个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'来使用万花筒。

所有这些工作在git 2.7。

0

你写

但是,有时候我发现与UNIX DIFF工作速度更快, 更有效(因为没有GUI参与)。我如何设置git,以便我可以轻松选择要触发的差异工具?

所以这个问题的答案应该简单地利用git的能力来区分基于控制台和gui的差异工具,而不是依靠编写外部命令。

通过将-g选项提供给git difftool,将使用将从配置变量diff.guitool而不是diff.tool中读取的diff工具。

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

就是这样。您可以使用git d <file1> <file2>或类似的方法调用您的gui工具p4merge,并使用git dc <file1> <file2>调用您的控制台工具。