Jak sprawić, by diff działał jak git-diff?

148

Podoba mi się formatowanie wyjściowe git diff. Kolor i +/- reprezentacja zmian między wierszami jest łatwiejsza do odczytania niż GNU diff.

Mogę uruchomić git diffza pomocą --no-indexflag poza repo git i działa dobrze. Jednak wydaje się, że brakuje --excludeopcji wykluczania plików lub podkatalogów z rekurencji diff.

Czy jest sposób, aby uzyskać to, co najlepsze z obu światów? (opcje kolorów i +/ -format git diffi --excludeopcja GNU diff).

Eksperymentowałem colordiff, ale nadal wolę format wyjściowygit diff

Mzzzzzz
źródło
1
Aby dokonać niebieski dla dodatków zielonych, zmiany newtextw /etc/colordiff. Myślę, że git używa zielonego?
Rudie
1
Aż do teraz nie słyszałem o fladze --no-index. Właśnie użyłem go do porównania danych wyjściowych z git show z różnicą dwóch plików - dzięki za to!
AJM-Reinstate-Monica

Odpowiedzi:

175

Nie wiem, jak zrobić kolor, ale zrobię to +/-raczej niż <i >.

diff -u file1 file2
jonescb
źródło
6
Fajnie, to w połączeniu z colordiff zbliża mnie wystarczająco blisko do tego, czego chcę. Chyba następnym razem muszę przewinąć dalej w dół strony podręcznika… Dzięki!
Mzzzzzz
13
Prosty sposób, aby uzyskać koloryzacja z diff -u, jest także rury wyjście do TIG poleceń git repo widz: diff -u file1 file2 | tig.
Samuel Lampa
3
Zainstaluj colordiffz repozytorium apt / yum / pacman i użyj go.
iBug
Potrzebne do włączenia dodatkowych pakietów dla Enterprise Linux (EPEL) na Amazon Linux, aby zainstalować colordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide/ ...
Pat Myron
1
Poza tym colordiffmożesz również uzyskać kolor vim, definiując cdiff() { diff -u $@ | vim -R -; }.
Syrtis Major
94

Możesz także użyć git diff --no-index -- A B(poprzez stronę podręcznika ).

eacousineau
źródło
1
+1, ale niestety to nie działa, jeśli jeden z plików jest dowiązaniem symbolicznym.
Emil Lundberg
2
+1 Jest to bardzo przydatne, ponieważ pokazuje, jak zrobić raport git, w którym dwa śledzone pliki Ai Bróżnią się między sobą, zamiast tego, gdzie każdy plik został zmodyfikowany w stosunku do ich ostatniej odpowiedniej wersji.
J. Katzwinkel
@EmilLundberg: działa dla mnie z dowiązaniami symbolicznymi w git 1.9.1 w systemie Linux. Nie wiem, czy wcześniejsze wersje są zepsute.
kkm
3
git diff --no-indexjest świetny, ale jak wskazał OP, brakuje mu --excludeflagi, więc często ma bardzo ograniczoną użyteczność.
Ken Williams
25
  1. Zainstaluj colordiff .

  2. Zaktualizuj swój ~ / .colordiffrc (kopiuj najpierw / etc / colordiffrc, jeśli to konieczne):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. Użyj colordiff -u file1 file2dla dwóch plików lub colordiff -ruN path1 path2do rekursywnego porównywania ścieżek.

To nie jest dokładnie to samo, ale jest bardzo blisko.

Steve
źródło
18

To właśnie proponuję i jest całkiem blisko

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: Musisz to zainstalować
    • brew install colordiff na moim Macu.
    • port install colordiff na niektórych komputerach Mac.
    • sudo apt-get install colordiff na Debianie lub Ubuntu
    • W przypadku innych platform pobierz źródło ze strony głównej lub GitHub i postępuj zgodnie z instrukcjami instalacji
  • -R: to mówi Lessowi, aby pokazywał kolory zamiast surowych kodów.

Ostatecznie użyłem, -wponieważ nie chciałem widzieć różnic z białymi znakami.

diff -w -u FILE1 FILE2 | colordiff | less -R

Edycja: zgodnie z sugestią @Ciprian Tomoiaga w komentarzu, możesz uczynić to funkcją i umieścić ją również w swoim ~/.bashrcpliku.

function gdiff () { diff -u $@ | colordiff | less -R; }
Nate
źródło
4
Aby mieć jedną funkcję bash dla tego, dodaj do .bashrc:function gdiff () { diff -u $@ | colordiff | less -R; }
Ciprian Tomoiagă
4

GNU diffma --coloropcję od wersji 3.4 pod koniec 2016 r., Zgodnie z tą odpowiedzią na Unix SE. To razem -upowinno wystarczyć, aby naśladować wyjście git diff:

diff -u --color=always file1 file2 | less -r

--colormusi być alwaysstosowany w rurze,auto wyłączy kolor w rurach.

Próbowałem tego tylko z Git Bash w systemie Windows, gdzie less -Rpokolorowałbym tylko pierwszą linię kawałka. less -rnaprawiłem to dla mnie w tym przypadku.

Codehearts
źródło
3

Korzystanie tylko bash, diff, tput, i lessmożemy ściśle zbliżenie wyjście git diff. Będą jednak pewne znaczące różnice ze względu na krótkowzroczność diffprogramistów.

Umieść następującą definicję funkcji Bash w jakimś 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 jest wywoływany z różnymi opcjami formatowania, aby określić, jak zmiany w plikach będą wyświetlane.
  2. tputsłuży do wstawiania kodów kolorów ANSI do tych opcji formatowania. Należy pamiętać, że podczas korzystania z terminali non-ANSI, być może trzeba będzie wymienić tput setafz tput setf.
  3. Wyjście diffjest przesyłane potokiem do less. -Rumożliwia zachowanie kolorów ANSI. -Xzapobiega lessczyszczeniu ekranu po wyjściu. -Fzapobiega lessdziałaniu jako pager, jeśli wyjście mieści się na jednym ekranie.
  4. Jeśli pierwszym parametrem jest @full, funkcja wyświetli wszystkie niezmienione wiersze oprócz dodanych i usuniętych wierszy.

Zwróć uwagę na następujące różnice między tym podejściem a git diff:

  1. git diffzgłasza trzy linie kontekstu otaczającego każdą zmianę. Niestety, diffwydaje się narzekać i kończy pracę, jeśli chcesz określić liczbę linii kontekstu, jednocześnie określając opcje formatowania. (Przynajmniej tak jest w systemie Mac OS X Yosemite). Dzięki diffprogramistom. W związku z tym można albo zażądać braku wierszy kontekstu otaczających każdą zmianę, co jest zachowaniem domyślnym, albo zażądać, aby wszystkie niezmienione wiersze w pliku były również zgłaszane, określając@full jako pierwszy parametr.
  2. Ponieważ wiersze kontekstu różnią się od git diff, numery wierszy zgłaszane przez tę funkcję będą również różnić się od tych zgłaszanych przezgit diff .
  3. Możesz zobaczyć obecność zgłoszonych zmian jednowierszowych, co jest poprawnym zachowaniem, ale denerwującym, gdy zmieniony plik zawiera wstawienie pojedynczych pustych wierszy. Myślę, że git diffradzi sobie z tym lepiej, poprzez kontekst. diffJeśli wolisz, możesz spróbować przekazać różne opcje, aby lepiej radzić sobie z białymi znakami.
Dejay Clayton
źródło
2

Umieść to w swoim .bashrclub .zshrc:

diff() { git diff --no-index "$1" "$2" | colordiff; }

wymagania: giticolordiff powinien być zainstalowany wcześniej.

stosowanie : diff file1 file2

przykład: za $diff .tmux.conf .zshrc.pre-oh-my-zsh

przykład funkcji diff

himanshuxd
źródło
0

Inną opcją jest zrobienie tego spoza repozytorium, aby git wiedział, jak rozróżniać pliki. na przykład. funkcja powłoki, taka jak:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}
Karl
źródło
0

Użyj colordiff :

Instalacja:

sudo apt-get install colordiff

Stosowanie:

colordiff -u file_one file_two

Daje dokładnie taką samą różnicę, jak pokazano na git diff.

Rakmo
źródło
0

Jeśli nie masz colordifflub git diff, możesz uzyskać kolor za pomocą vim.

cdiff() { diff -u $@ | vim -R -; }

lub po prostu

cdiff() { diff -u $@ | view -; }
Syrtis Major
źródło
0

Ponieważ nietoperz ma ładne koloryzowanie, przetestowałem, czy to też działa diffi, co zaskakujące, działało naprawdę dobrze po wyjęciu z pudełka.

$ diff file1 file2 | bat lub $ diff -u file1 file2 | bat

Więc przypuszczam, że możesz sprawić, by funkcja taka jak ta była bardziej wydajna:

function bdiff () { diff -u $@ | bat;}
Heechul Ryu
źródło
0

Przetestowano w Debianie 9 diff -u --color=always file1 file2

NoOneYouKnow
źródło
-2

Myślę, że ustawienie config:

[color]
     ui = true

w połączeniu z --relative=<path>opcją polecenia "diff" zrobiłoby to, co chciałeś. Próbowałeś ?

None-da
źródło
3
To jest dla różnicy w git. Pytał o diffopcje programu
tr33hous