Как заставить diff работать как git -diff?

Мне нравится форматирование вывода git diff. Цвет и представление изменений между строками в +/- легче читать, чем в GNU diff.

Я могу запустить git diff используя флаг --no-index вне git-репо, и он работает нормально. Однако, по-видимому, отсутствует опция --exclude для исключения файлов или подкаталогов из рекурсивного diff.

Есть ли способ получить лучшее из обоих миров? (параметры цвета и формат +/- для git diff и --exclude для GNU diff).

Я экспериментировал с colordiff, но все же предпочитаю формат вывода git diff

Ответ 1

Я не знаю, как сделать цвет, но это сделает +/-, а не < и >.

diff -u file1 file2

Ответ 2

Вы также можете использовать git diff --no-index -- A B (через manpage).

Ответ 3

  • Установите colordiff.

  • Обновите файл ~/.colordiffrc(сначала скопируйте /etc/colordiffrc ):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  • Используйте colordiff -u file1 file2 для двух файлов или colordiff -ruN path1 path2 для рекурсивного сравнения путей.

Это не совсем то же самое, но очень близко.

Ответ 4

Это то, что я предлагаю, и это довольно близко

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: вам нужно будет установить это
  • -R: это говорит "Меньше" показывать цвета вместо необработанных кодов.

В конечном итоге я использовал -w, потому что не хотел видеть пробелы.

diff -w -u FILE1 FILE2 | colordiff | less -R

Изменить: как было предложено @Ciprian Tomoiaga в комментарии, вы можете сделать эту функцию и поместить ее в свой файл ~/.bashrc.

function gdiff () { diff -u [email protected] | colordiff | less -R; }

Ответ 5

Используя только bash, diff, tput и less, мы можем близко аппроксимировать вывод git diff. Однако будут некоторые заметные различия из-за близорукости программистов diff.

Поместите следующее определение функции Bash в некоторый файл, который автоматически получает вашу учетную запись пользователя, и вы сможете получить доступ к функции из командной строки:

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

Эта функция работает следующим образом:

  • В конечном итоге diff вызывается с различными параметрами форматирования, чтобы указать, как будут отображаться изменения в файлах.
  • tput используется для вставки цветовых кодов ANSI в эти параметры форматирования. Обратите внимание, что при использовании терминалов, отличных от ANSI, вам может потребоваться заменить tput setaf на tput setf.
  • Выход diff поступает в less. -R позволяет сохранять цвета ANSI. -X не позволяет less очистить экран при выходе. -F предотвращает работу less в качестве пейджера, если выход соответствует одному экрану.
  • Если первый параметр @full, функция будет отображать все неизменные строки в дополнение к добавленным и удаленным строкам.

Обратите внимание на следующие различия между этим подходом и git diff:

  • git diff сообщает о трех линиях контекста, окружающих каждое изменение. К сожалению, diff, кажется, жалуется и выходит, если вы хотите указать количество строк контекста, одновременно указывая параметры форматирования. (По крайней мере, это в Mac OS X Yosemite). Спасибо diff программистам. Таким образом, вы можете запросить строки контекста, окружающие каждое изменение, которое является поведением по умолчанию, или вы можете запросить также, чтобы все неизменные строки в файле также указывались, указав @full в качестве первого параметра.
  • Так как строки контекста отличаются от git diff, номера строк, сообщаемые этой функцией, также будут отличаться от тех, которые указаны в git diff.
  • Вы можете видеть наличие однострочных изменений, о которых сообщается, что является правильным поведением, но раздражает, когда ваш измененный файл содержит вставку одиночных пустых строк. Я думаю, что git diff справляется с этим лучше, используя свои линии контекста. Вы можете попробовать передать различные параметры diff, чтобы лучше справляться с пробелами, если хотите.

Ответ 6

Вы ищете colordiff:

sudo apt-get install colordiff

Ответ 7

Поместите это в свой .bashrc или .zshrc:

diff() { git diff --no-index "$1" "$2" | colordiff; }

Требования: git и colordiff должны быть установлены заранее.

использование: diff file1 file2

пример: для $diff .tmux.conf .zshrc.pre-oh-my-zsh

пример функции diff

Ответ 8

GNU diff имеет опцию --color с версии 3.4 в конце 2016 года согласно этому ответу в Unix SE. Этого вместе с -u должно быть достаточно, чтобы имитировать вывод git diff:

diff -u --color=always file1 file2 | less -r

--color должно быть always при использовании в pipeе, auto отключит цвет в pipeх.

Я только пробовал это с Git Bash на Windows, где less -R только закрасит первую строку фрагмента. less -r исправил это для меня в этом случае.

Ответ 9

Другой вариант - сделать это из-за пределов репозитория, поэтому git знает, как различать файлы. например. функция оболочки что-то вроде:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}

Ответ 10

Используйте colordiff:

Установка:

sudo apt-get install colordiff

Использование:

colordiff -u file_one file_two

Дает точно такую же разницу, как показано в git diff.

Ответ 11

Если у вас нет colordiff или git diff, вы можете получить цвет с помощью vim.

cdiff() { diff -u [email protected] | vim -R -; }

или просто

cdiff() { diff -u [email protected] | view -; }

Ответ 12

Я думаю, что настройка конфигурации:

[color]
     ui = true

в сочетании с командой "diff" --relative=<path> будет делать то, что вы хотели. Вы пробовали?