Korzystanie tylko bash
, diff
, tput
i less
możemy ściśle zbliżenie wyjście git diff
. Z uwagi na krótkowzroczność programistów diff
, pojawią się jednak pewne istotne różnice.
Umieść następujący Bash definicję funkcji w jakimś pliku, który zostaje automatycznie pochodzących konta użytkownika, a będziesz mieć dostęp do funkcji z wiersza poleceń:
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
}
Funkcja ta działa w następujący sposób:
- Docelowo
diff
jest wywoływane za pomocą różnych opcji formatowania, aby określić, w jaki sposób będą wyświetlane zmiany w plikach.
tput
służy do wstawiania kodów kolorów ANSI do tych opcji formatowania. Należy pamiętać, że w przypadku używania terminali innych niż ANSI może być konieczne zastąpienie tput setaf
przez tput setf
.
- Dane wyjściowe
diff
są przesyłane do less
. -R
pozwala na zachowanie kolorów ANSI. -X
zapobiega usunięciu ekranu po wyjściu z ekranu. -F
zapobiega działaniu stronyjako pagera, jeśli wyjście mieści się na jednym ekranie.
- Jeśli pierwszym parametrem jest
@full
, funkcja wyświetli wszystkie niezmienione linie oprócz dodanych i usuniętych linii.
zwrócić uwagę na następujące różnice między tym podejściem i git diff
:
git diff
zgłasza trzy linie kontekście otaczających każdą zmianę. Niestety, diff
wydaje się narzekać i wyjść, jeśli chcesz określić liczbę linii kontekstowych, jednocześnie określając jednocześnie opcje formatowania. (Przynajmniej tak jest w Mac OS X Yosemite). Dzięki diff
programistów. W związku z tym można zażądać braku linii kontekstu otaczających każdą zmianę, co jest domyślnym zachowaniem, lub można zażądać, aby wszystkie niezmienione wiersze w pliku również zostały zgłoszone, podając @full
jako pierwszy parametr.
- Ponieważ linie kontekstu różnią się od
git diff
, numery linii zgłaszane przez tę funkcję będą różnić się od tych podanych przez git diff
.
- Możesz zobaczyć obecność zgłoszonych pojedynczych linii, co jest poprawnym zachowaniem, ale denerwujące, gdy zmieniony plik zawiera wstawienie pojedynczych pustych linii. Wydaje mi się, że lepiej sobie z tym poradzić, korzystając z linii kontekstu. Możesz spróbować przekazać różne opcje do
diff
, aby lepiej radzić sobie z białymi znakami, jeśli wolisz.
Aby dokonać niebieski dla dodatków zielony, zmiana 'newtext' w'/etc/colordiff'. Myślę, że git używa zieleni? – Rudie