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

148

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

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

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

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

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

Ответы:

175

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

diff -u file1 file2
jonescb
источник
6
Круто, это в сочетании с colordiff приближает меня к тому, чего я хочу. Думаю, в следующий раз мне нужно прокрутить страницу справочника дальше ... Спасибо!
Mzzzzzz
13
Простой способ получить раскрашивание с дифф -u, также конвейерный вывод в ТИГ, командная строка мерзавец репо Зритель: diff -u file1 file2 | tig.
Самуэль Лампа
3
Установите colordiffиз своего репозитория apt / yum / pacman и используйте его.
iBug
Необходимо установить дополнительные пакеты для Enterprise Linux (EPEL) в Amazon Linux для установки colordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
Пэт Майрон,
1
Кроме того colordiff, вы также можете получить цвет с vimпомощью определения cdiff() { diff -u $@ | vim -R -; }.
Syrtis Major
94

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

eacousineau
источник
1
+1, но, к сожалению, это не работает, если один из файлов является символической ссылкой.
Эмиль Лундберг
2
+1 Это очень полезно , так как он показывает , как сделать GIT отчет , в котором два отслеживаются файлы Aи Bотличаются по сравнению с друг с другом вместо того , где каждый файл был изменен , по сравнению с их последней соответствующей ревизии.
J. Katzwinkel
@EmilLundberg: у меня работает с символическими ссылками в git 1.9.1 на Linux. Я не знаю, сломаны ли более ранние версии.
ккм
3
git diff --no-indexэто здорово, но, как указал OP, у него нет --excludeфлага, поэтому он часто очень ограничен в полезности.
Кен Уильямс
25
  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для рекурсивного сравнения путей.

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

Стив
источник
18

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

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 $@ | colordiff | less -R; }
Nate
источник
4
Чтобы иметь одну функцию bash для этого, добавьте в .bashrc:function gdiff () { diff -u $@ | colordiff | less -R; }
Ciprian Tomoiagă
4

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

codehearts
источник
3

Используя только 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лучше справляться с пробелами, если хотите.
Дежай Клэйтон
источник
2

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

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

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

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

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

пример различий

himanshuxd
источник
0

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

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}
Карл
источник
0

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

Монтаж:

sudo apt-get install colordiff

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

colordiff -u file_one file_two

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

Rakmo
источник
0

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

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

или просто

cdiff() { diff -u $@ | view -; }
Syrtis Major
источник
0

Так как у летучей мыши есть хорошая окраска, я проверил, работает ли она с этим diffтоже, и удивительно, что это работало действительно хорошо из коробки.

$ diff file1 file2 | bat или $ diff -u file1 file2 | bat

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

function bdiff () { diff -u $@ | bat;}
Heechul Ryu
источник
0

Протестировано в Debian 9 diff -u --color=always file1 file2

NoOneYouKnow
источник
-2

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

[color]
     ui = true

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

Без-да
источник
3
Это для различий в git. Он спрашивал о параметрах diffпрограммы
tr33hous