Використовуючи тільки 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 використовує зелений?