Используя только 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 использует зеленый?