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


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

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

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

я экспериментировал с colordiff, но я все еще предпочитаю выходной формат git diff

11 103

11 ответов:

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

diff -u file1 file2

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

  1. установить colordiff.

  2. обновить ваш ~/.colordiffrc (копирование /etc/colordiffrc сначала, если необходимо):

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

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

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

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

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

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

Edit: как предложил @Ciprian Tomoiaga в комментарии, Вы можете сделать эту функцию и поместить ее в свой тоже.

function gdiff () { diff -u $@ | colordiff | less -R; }

вы ищете colordiff:

sudo apt-get install colordiff

используя только 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=''

    [[ "" == '@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
}

эта функция работает следует:

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

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

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

поместите это в ваш .bashrc или .zshrc:

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

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

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

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

diff function example

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

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

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

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

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

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

использовать colordiff:

установка:

sudo apt-get install colordiff

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

colordiff -u file_one file_two

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

Я думаю, что config параметр :

[color]
     ui = true

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