2011-01-31 15 views
90

Podoba mi się formatowanie wyjściowe git diff. Kolor i odwzorowanie zmian między wierszami są łatwiejsze do odczytania niż różnice w GNU.Jak uzyskać różnicę działającą jak git-diff?

Mogę uruchomić git diff przy użyciu flagi --no-index poza repozytorium git i działa poprawnie. Jednak wydaje się, że brakuje opcji --exclude do wykluczania plików lub podkatalogów z rekurencyjnego diff.

Czy istnieje sposób na uzyskanie najlepszych z obu światów? (opcje kolorów i format +/ dla opcji git diff i --exclude opcji GNU diff).

Mam eksperymentował z colordiff, ale nadal wolą format wyjściowy git diff

+1

Aby dokonać niebieski dla dodatków zielony, zmiana 'newtext' w'/etc/colordiff'. Myślę, że git używa zieleni? – Rudie

Odpowiedz

106

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

diff -u file1 file2 
+5

Fajnie, to w połączeniu z colordiffem przybliża mnie do tego, co chcę. Chyba muszę następnym razem przewinąć stronę podręcznika ... Dzięki! – Mzzzzzz

+4

Prostym sposobem na zabarwienie za pomocą diff -u, jest również wyprowadzenie wyjścia do tig, wiersza poleceń git repo: 'diff -u plik1 plik2 | tig'. –

-1

myślę ustawienie config:

[color] 
    ui = true 

połączeniu z "Diff" polecenia za --relative=<path> opcji zrobi to, czego chciał. Próbowałeś ?

+2

To jest dla diff w 'git'. Pytał o opcje programu 'diff' – tr33hous

0

Inną opcją jest zrobienie tego spoza repozytorium, dzięki czemu git wie, że różni się między plikami. na przykład. funkcją powłoki coś takiego:

gdiff() { 
    (
     dir=`pwd` 
     cd ./$(git rev-parse --show-cdup)/.. 
     git diff $dir/$1 $dir/$2 
    ) 
} 
70

Można również użyć git diff --no-index -- A B (przez manpage).

+1

+1, ale niestety to nie działa, jeśli jeden z plików jest dowiązaniem symbolicznym. –

+2

+1 Jest to bardzo użyteczne, ponieważ pokazuje, jak utworzyć raport git, w którym dwa pliki śledzące "A" i "B" różnią się w porównaniu z * sobą nawzajem *, zamiast gdzie każdy plik został zmodyfikowany względem ostatniej odpowiedniej wersji. –

+0

@EmilLundberg: działa dla mnie z dowiązaniami symbolicznymi w git 1.9.1 na Linuksie. Nie wiem, czy wcześniejsze wersje są zepsute. – kkm

20
  1. Zainstaluj colordiff.

  2. Aktualizacja ~/.colordiffrc (kopiowanie/etc/pierwszy colordiffrc, jeśli to konieczne):

    # be more git-like: 
    plain=off 
    newtext=darkgreen 
    oldtext=darkred 
    diffstuff=darkcyan 
    
  3. colordiff -u file1 file2 Zastosowanie dwóch plików lub colordiff -ruN path1 path2 ścieżek rekurencyjnie porównywanie.

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

13

To co proponuję i to całkiem blisko

diff -u FILE1 FILE2 | colordiff | less -R 
  • colordiff: Musisz zainstalować ten
    • 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, pobrać źródła z the main page lub GitHub i postępuj the installation instructions
  • -R: to mówi Mniej pokazać kolory zamiast surowych kodów.

Ostatecznie użyłem -w, ponieważ nie chciałem zobaczyć różnic białych znaków.

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

Edit: Jak sugeruje @Ciprian Tomoiaga w komentarzu, można zrobić to funkcja i umieścić go w pliku ~/.bashrc też.

function gdiff() { diff -u [email protected] | colordiff | less -R; } 
+4

Aby mieć jedną funkcję bash dla tego dodatku do .bashrc: 'function gdiff() {diff -u $ @ | colordiff | mniej -R; } ' –

2

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:

  1. 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.
  2. 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.
  3. 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.
  4. 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:

  1. 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.
  2. 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.
  3. 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.
1

Place to w swoim .bashrc lub .zshrc:

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

WYMAGANIA: git i colordiff powinny być zainstalowane przed ręką.

Wykorzystanie: diff file1 file2

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

diff function example

Powiązane problemy