Используя только 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
, чтобы лучше справляться с пробелами, если хотите.