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