Как заставить 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 -REdit: как предложил @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.
