Несколько инструментов сравнения - PullRequest
15 голосов
/ 27 января 2012

Я настроил git на использование P4Merge в качестве инструмента сравнения, как описано здесь .Итак, git diff вызовет P4Merge.

Однако иногда я нахожу, что работа с UNIX diff быстрее и эффективнее (потому что никакой графический интерфейс не задействован).Как мне настроить 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 ]

5 голосов
/ 06 декабря 2012

Git может легко управлять визуальной и командной строкой diff. Не требуется никакой навороченной настройки

git diff (по умолчанию) использует unix diff

, если вы хотите использовать инструмент визуального рассеяния, а правильный способ его настройки находится в файле ~/.gitconfig с таким разделом:

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

То, что следует после cmd =, относится к конкретному приложению для визуального анализа.

Это не стандартная практика манипулирования git diff для отправки контента в приложение визуального анализа. Таким образом, вопрос ищет ответ, который на 100% обратен от встроенной функциональности.

Подробнее см. Справочную страницу git-difftool .

5 голосов
/ 27 января 2012

ОБНОВЛЕНИЕ: Если, как и ОП, вы хотите, чтобы git difftool вызывал функцию сравнения по умолчанию вместо внешнего инструмента, тогда работает простая версия в конце этого ответа.Однако метод, который я предпочитаю и рекомендую, если вам нужны только несколько инструментов сравнения, - это метод файла .gitconfig, описанный в Ответ DrStrangeprok.


В качестве вашеговнешний инструмент для редактирования.(то есть: заменить содержимое 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', тогда она будет использовать 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

}
4 голосов
/ 22 января 2016

Вы можете просто явно указать, какой 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.

1 голос
/ 18 сентября 2012

Было бы неплохо, если бы Git мог как-то иметь разные настройки для каждого, но если нет, чтобы расширить ответ Аппака, следующее, добавленное к .bashrc, может вызывать text 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-opendiff и git-diff-p4diff (это сценарии оболочки).

0 голосов
/ 01 марта 2016

Вы пишете

Однако иногда я нахожу, что работа с разницей в UNIX более быстрая и эффективная (потому что графический интерфейс не задействован).Как мне настроить git так, чтобы я мог легко выбирать, какой инструмент сравнения я бы хотел запустить?

Так что ответ на этот вопрос должен просто воспользоваться способностью git различать консоль и графический интерфейс.инструменты сравнения и не полагаются на написание внешней команды.

При предоставлении опции -g для git difftool используемый инструмент сравнения будет считан из настроенной переменной diff.guitool вместо diff.tool.

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

Вот и все,Вы бы вызвали инструмент GUI p4merge, используя git d <file1> <file2> или аналогичный, а инструмент консоли - git dc <file1> <file2>.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...