Jak sprawić, by diff działał jak git-diff?
Podoba mi się formatowanie wyjścia git diff
. Kolor i +
/-
Reprezentacja zmian między wierszami jest łatwiejsza do odczytania niż GNU diff.
Mogę uruchomić git diff
używając flagi --no-index
poza repo Gita i działa dobrze. Jednak wygląda na to, że brakuje opcji --exclude
do wyłączenia plików lub podkatalogów z rekurencyjnego diff
.
Czy jest sposób, aby uzyskać to, co najlepsze z obu światów? (Opcje kolorów i +
/-
format git diff
i --exclude
opcji GNU diff).
Eksperymentowałem z colordiff
, ale nadal wolę format wyjściowy git diff
11 answers
Nie wiem jak zrobić kolor, ale to zrobi +/-
zamiast <
i >
.
diff -u file1 file2
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-31 23:40:10
Można również użyć git diff --no-index -- A B
(poprzez strona podręcznika ).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-02 19:16:19
Install colordiff .
-
Zaktualizuj swoje~/.colordiffrc (kopiowanie /etc / colordiffrc najpierw, jeśli to konieczne):
# be more git-like: plain=off newtext=darkgreen oldtext=darkred diffstuff=darkcyan
Użyj {[1] } dla dwóch plików lub
colordiff -ruN path1 path2
do rekurencyjnego porównywania ścieżek.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-06 14:46:38
To jest to, co sugeruję i jest dość blisko
diff -u FILE1 FILE2 | colordiff | less -R
-
colordiff
: będziesz musiał zainstalować to- Na moim Macu.
- Na niektórych komputerach Mac.
-
sudo apt-get install colordiff
na Debianie lub Ubuntu - dla innych platform Pobierz źródło z strony głównej lub GitHub i postępuj zgodnie z instrukcjami instalacji
-
-R
: to mówi mniej, aby pokazywać kolory zamiast surowych kodów.
I ostatecznie użyłem -w
, ponieważ nie chciałem widzieć różnic w białych znakach.
diff -w -u FILE1 FILE2 | colordiff | less -R
Edit: zgodnie z sugestią @ Ciprian Tomoiaga w komentarzu, możesz zrobić z tego funkcję i umieścić ją w swoim pliku ~/.bashrc
.
function gdiff () { diff -u $@ | colordiff | less -R; }
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-06 15:57:36
Szukasz colordiff
:
sudo apt-get install colordiff
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-06 14:47:09
Używanie tylko bash
, diff
, tput
, i less
, możemy ściśle zbliżyć wyjście git diff
. Będą jednak pewne znaczące różnice ze względu na krótkowzroczność programistów diff
.
Umieść następującą definicję funkcji Bash w pliku, który jest pobierany automatycznie przez twoje konto użytkownika, a będziesz mógł uzyskać 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
}
Ta funkcja działa w następujący sposób:
- ostatecznie,
diff
zostaje wywołana z różne opcje formatowania określające sposób wyświetlania zmian w plikach. -
tput
jest używany do wstawiania kodów kolorów ANSI do tych opcji formatowania. Zauważ, że jeśli używasz terminali innych niż ANSI, może być konieczne zastąpienietput setaf
przeztput setf
. - wyjście
diff
jest przesyłane doless
.-R
pozwala zachować kolory ANSI.-X
zapobiega czyszczeniu ekranu po wyjściu z niego.-F
uniemożliwialess
działanie jako pager, jeśli wyjście mieści się w jednym ekran. - Jeśli pierwszym parametrem jest
@full
, funkcja wyświetli wszystkie niezmienione linie oprócz dodanych i usuniętych linii.
Zwróć uwagę na następujące różnice między tym podejściem a git diff
:
-
git diff
zgłasza trzy linie kontekstu otaczające każdą zmianę. Niestety,diff
wydaje się narzekać i kończyć, jeśli chcesz podać liczbę linii kontekstu, jednocześnie podając opcje formatowania. (Przynajmniej tak jest w Mac OS X Yosemite). Dzięki programistom. W związku z tym możesz albo zażądać braku linii kontekstu otaczających każdą zmianę, co jest domyślnym zachowaniem, albo możesz zażądać, aby wszystkie niezmienione linie w pliku były również zgłaszane, podając jako pierwszy parametr@full
. - ponieważ linie kontekstu różnią się od
git diff
, numery linii zgłaszane przez tę funkcję będą również różnić się od tych zgłaszanych przezgit diff
. - możesz zobaczyć obecność zmian w jednym wierszu zgłaszane, co jest poprawne zachowanie, ale denerwujące, gdy zmieniony plik zawiera wstawianie pojedynczych pustych linii. Myślę, że
git diff
radzi sobie z tym lepiej, poprzez swoje linie kontekstu. Możesz spróbować przekazać różne opcjediff
, aby lepiej radzić sobie z białymi spacjami, jeśli wolisz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-01 04:45:59
Umieść to w swoim .bashrc
LUB .zshrc
:
diff() { git diff --no-index "$1" "$2" | colordiff; }
Wymagania: git
i colordiff
powinny być zainstalowane przed ręką.
Użycie: diff file1 file2
Przykład: for $diff .tmux.conf .zshrc.pre-oh-my-zsh
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-28 17:59:01
GNU diff
mA opcję --color
od wersji 3.4 pod koniec 2016 roku zgodnie z ta odpowiedź na Unix SE. Że obok {[2] } powinno wystarczyć do naśladowania wyjścia git diff
:
diff -u --color=always file1 file2 | less -r
--color
musi być always
W przypadku użycia w rurze, {[7] } wyłączy kolor w rurach.
Próbowałem tego tylko z Git Bash na Windows, gdzie less -R
kolorowałby tylko pierwszą linię kawałka. less -r
naprawiłem to dla mnie w tym przypadku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-12 18:53:28
Inną opcją jest zrobienie tego z zewnątrz repozytorium, aby git wiedział, jak różnicować pliki. np. funkcja powłoki coś w stylu:
gdiff() {
(
dir=`pwd`
cd ./$(git rev-parse --show-cdup)/..
git diff $dir/$1 $dir/$2
)
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-03 00:50:26
Użyj colordiff :
Instalacja:
sudo apt-get install colordiff
Użycie:
colordiff -u file_one file_two
Daje dokładnie taką samą różnicę jak pokazana przez git diff
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 11:25:42
Myślę, że ustawienie config:
[color]
ui = true
W połączeniu z opcją --relative=<path>
polecenia" diff " zrobiłby to, co chciałeś. Próbowałeś ?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-01 02:27:36