Как заставить diff работать как git-diff?
мне нравится форматирование вывода git diff
. Цвет и +
/-
представление изменений между строками легче читать, чем GNU diff.
Я могу запустить git diff
используя --no-index
флаг вне git РЕПО, и он отлично работает. Однако, похоже, он отсутствует --exclude
опция для исключения файлов или подкаталогов из рекурсивного diff
.
есть ли способ получить лучшее из обоих миров? (варианты цвета и +
/ из git diff
и --exclude
опция GNU diff).
я экспериментировал с colordiff
, но я все еще предпочитаю выходной формат git diff
11 ответов:
вы также можете использовать
git diff --no-index -- A B
(через manpage).
установить colordiff.
обновить ваш ~/.colordiffrc (копирование /etc/colordiffrc сначала, если необходимо):
# be more git-like: plain=off newtext=darkgreen oldtext=darkred diffstuff=darkcyan
использовать
colordiff -u file1 file2
для двух файлов илиcolordiff -ruN path1 path2
для рекурсивного сравнения путей.Это не совсем то же самое, но очень близко.
это то, что я предлагаю, и это очень близко
diff -u FILE1 FILE2 | colordiff | less -R
colordiff
: вам придется установить это
brew install colordiff
на моем Mac.port install colordiff
на некоторых компьютерах Mac.sudo apt-get install colordiff
на Debian или Ubuntu- для других платформ, скачать источник главная страница или GitHub и следовать инструкция по установке
-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 }
эта функция работает следует:
- в конечном итоге,
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
чтобы лучше иметь дело с пробелами, если вы предпочитаете.
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
.