Ответ 1
Я не знаю, как сделать цвет, но это сделает +/-
, а не <
и >
.
diff -u file1 file2
Мне нравится форматирование вывода git diff
. Цвет и представление изменений между строками в +
/-
легче читать, чем в GNU diff.
Я могу запустить git diff
используя флаг --no-index
вне git-репо, и он работает нормально. Однако, по-видимому, отсутствует опция --exclude
для исключения файлов или подкаталогов из рекурсивного diff
.
Есть ли способ получить лучшее из обоих миров? (параметры цвета и формат +
/-
для git diff
и --exclude
для GNU diff).
Я экспериментировал с colordiff
, но все же предпочитаю формат вывода git diff
Я не знаю, как сделать цвет, но это сделает +/-
, а не <
и >
.
diff -u file1 file2
Вы также можете использовать 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-R
: это говорит "Меньше" показывать цвета вместо необработанных кодов.В конечном итоге я использовал -w
, потому что не хотел видеть пробелы.
diff -w -u FILE1 FILE2 | colordiff | less -R
Изменить: как было предложено @Ciprian Tomoiaga в комментарии, вы можете сделать эту функцию и поместить ее в свой файл ~/.bashrc
.
function gdiff () { diff -u [email protected] | colordiff | less -R; }
Используя только 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
}
Эта функция работает следующим образом:
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
, чтобы лучше справляться с пробелами, если хотите.Вы ищете colordiff
:
sudo apt-get install colordiff
Поместите это в свой .bashrc
или .zshrc
:
diff() { git diff --no-index "$1" "$2" | colordiff; }
Требования: git
и colordiff
должны быть установлены заранее.
использование: diff file1 file2
пример: для $diff .tmux.conf .zshrc.pre-oh-my-zsh
GNU diff
имеет опцию --color
с версии 3.4 в конце 2016 года согласно этому ответу в Unix SE. Этого вместе с -u
должно быть достаточно, чтобы имитировать вывод git diff
:
diff -u --color=always file1 file2 | less -r
--color
должно быть always
при использовании в pipeе, auto
отключит цвет в pipeх.
Я только пробовал это с Git Bash на Windows, где less -R
только закрасит первую строку фрагмента. less -r
исправил это для меня в этом случае.
Другой вариант - сделать это из-за пределов репозитория, поэтому git знает, как различать файлы. например. функция оболочки что-то вроде:
gdiff() {
(
dir=`pwd`
cd ./$(git rev-parse --show-cdup)/..
git diff $dir/$1 $dir/$2
)
}
Используйте colordiff:
Установка:
sudo apt-get install colordiff
Использование:
colordiff -u file_one file_two
Дает точно такую же разницу, как показано в git diff
.
Если у вас нет colordiff
или git diff
, вы можете получить цвет с помощью vim
.
cdiff() { diff -u [email protected] | vim -R -; }
или просто
cdiff() { diff -u [email protected] | view -; }
Я думаю, что настройка конфигурации:
[color]
ui = true
в сочетании с командой "diff" --relative=<path>
будет делать то, что вы хотели. Вы пробовали?