Используя только 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
лучше справляться с пробелами, если хотите.
newtext
на/etc/colordiff
. Я думаю, что Git использует зеленый?