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

Author: himanshuxd, 2011-02-01

11 answers

Nie wiem jak zrobić kolor, ale to zrobi +/- zamiast < i >.

diff -u file1 file2
 123
Author: jonescb,
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 ).

 75
Author: eacousineau,
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
  1. Install colordiff .

  2. Zaktualizuj swoje~/.colordiffrc (kopiowanie /etc / colordiffrc najpierw, jeśli to konieczne):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. Użyj {[1] } dla dwóch plików lub colordiff -ruN path1 path2 do rekurencyjnego porównywania ścieżek.

To nie jest dokładnie to samo, ale jest bardzo blisko.
 22
Author: Steve,
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
  • -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; }
 14
Author: Nate,
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
 2
Author: Davoud Taghawi-Nejad,
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:

  1. ostatecznie, diff zostaje wywołana z różne opcje formatowania określające sposób wyświetlania zmian w plikach.
  2. 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ąpienie tput setaf przez tput setf.
  3. wyjście diff jest przesyłane do less. -R pozwala zachować kolory ANSI. -X zapobiega czyszczeniu ekranu po wyjściu z niego. -F uniemożliwia less działanie jako pager, jeśli wyjście mieści się w jednym ekran.
  4. 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:

  1. 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.
  2. 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 przez git diff.
  3. 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 opcje diff, aby lepiej radzić sobie z białymi spacjami, jeśli wolisz.
 2
Author: Dejay Clayton,
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

przykład funkcji diff

 1
Author: himanshuxd,
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.

 1
Author: codehearts,
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
    )
}
 0
Author: Karl,
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.

 0
Author: Omkar Deshpande,
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ś ?

 -1
Author: None-da,
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