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

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

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

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

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


person Mzzzzzz    schedule 31.01.2011    source источник
comment
Чтобы сделать синий для добавлений зеленым, измените newtext на /etc/colordiff. Я думаю, что git использует зеленый цвет?   -  person Rudie    schedule 08.03.2015
comment
До сих пор я никогда не слышал о флаге --no-index. Я только что использовал его, чтобы сравнить вывод git show с различием двух файлов - спасибо за это!   -  person AJM-Reinstate-Monica    schedule 03.02.2020


Ответы (14)


Это сделает +/-, а не < и >.

diff -u file1 file2

Начиная с GNU diffutils 3.4 добавлен флаг --color. Объединение обоих дает следующее:

diff --color -u file1 file2

Флаг --color также принимает аргумент, допустимые варианты: never, always или auto. Полезно, когда вы хотите более четко указать, что нужно сделать.

person jonescb    schedule 31.01.2011
comment
Круто, это в сочетании с colordiff приближает меня к тому, что я хочу. Думаю, в следующий раз мне нужно будет пролистать справочную страницу дальше ... Спасибо! - person Mzzzzzz; 01.02.2011
comment
Простой способ получить раскрашивание с помощью diff -u - также передать вывод в tig, средство просмотра репозитория git из командной строки: diff -u file1 file2 | tig. - person Samuel Lampa; 02.09.2015
comment
Установите colordiff из репозитория apt / yum / pacman и используйте его. - person iBug; 29.07.2018
comment
Требуется включить дополнительные пакеты для Enterprise Linux (EPEL) в Amazon Linux для установки colordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide/ - person Pat Myron; 23.08.2019
comment
Помимо colordiff, вы также можете получить цвет с помощью vim, задав cdiff() { diff -u $@ | vim -R -; }. - person Syrtis Major; 04.09.2019
comment
К сожалению, это не работает в macOS, BSD diff использует -u для другого параметра. - person Adam Stewart; 09.01.2020
comment
Добавление --color=always включит цвета - person Bhupesh Varshney; 25.10.2020

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

person eacousineau    schedule 02.07.2013
comment
+1, но, к сожалению, это не работает, если один из файлов является символической ссылкой. - person Emil Lundberg; 29.07.2013
comment
+1 Это очень полезно, поскольку показывает, как создать отчет git, в котором два отслеживаемых файла A и B отличаются по сравнению с друг другом вместо того, где каждый файл был изменен относительно их последней соответствующей ревизии. - person J. Katzwinkel; 22.01.2015
comment
@EmilLundberg: у меня работает с символическими ссылками в git 1.9.1 в Linux. Не знаю, сломаны ли более ранние версии. - person kkm; 01.07.2015
comment
git diff --no-index - это здорово, но, как указал OP, ему не хватает флага --exclude, поэтому он часто имеет очень ограниченную полезность. - person Ken Williams; 31.05.2016

  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 для рекурсивного сравнения путей.

Это не совсем то же самое, но очень похоже.

person Steve    schedule 29.11.2013

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

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: You'll have to install this
  • -R: это указывает Less показывать цвета вместо исходных кодов.

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

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

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

function gdiff () { diff -u $@ | colordiff | less -R; }
person Nate    schedule 21.08.2014
comment
Чтобы для этого была одна функция bash, добавьте в .bashrc: function gdiff () { diff -u $@ | colordiff | less -R; } - person Ciprian Tomoiagă; 01.09.2014

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 исправил это для меня в этом случае.

person codehearts    schedule 12.06.2018

Используя только 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
}

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

  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 различные параметры, чтобы лучше обрабатывать пробелы, если хотите.
person Dejay Clayton    schedule 21.10.2015

Вы ищете colordiff:

sudo apt-get install colordiff
person Davoud Taghawi-Nejad    schedule 17.01.2013

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

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

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

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

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

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

person himanshuxd    schedule 28.11.2017

Поскольку у bat хорошая раскраска, я проверил, работает ли это и с diff, и, на удивление, он работал очень хорошо. из коробки.

$ diff file1 file2 | bat or $ diff -u file1 file2 | bat

Итак, я полагаю, вы могли бы сделать функцию, подобную приведенной ниже, более эффективной:

function bdiff () { diff -u $@ | bat;}
person Heechul Ryu    schedule 25.01.2020

Проверено в debian 9 diff -u --color=always file1 file2

person NoOneYouKnow    schedule 26.06.2020

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

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

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

Установка:

sudo apt-get install colordiff

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

colordiff -u file_one file_two

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

person Rakmo    schedule 23.08.2018

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

cdiff() { diff -u $@ | vim -R -; }

или просто

cdiff() { diff -u $@ | view -; }
person Syrtis Major    schedule 04.09.2019

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

[color]
     ui = true

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

person None-da    schedule 01.02.2011
comment
Это для разницы в git. Он просил diff параметры программы - person tr33hous; 13.08.2014