2013-03-07 8 views
7

Załóżmy, że edytuję plik. Jeśli zapiszę plik, git-diff poda mi swoje zmiany względem indeksu. Chciałbym uzyskać zmiany względem indeksu bez uprzedniego zapisania pliku - dla porównania "w czasie rzeczywistym".Czy można odróżnić plik git od standardowego wejścia?

Jednym z rozwiązań jest zapisanie niezapisanych zmian w pliku tymczasowym (tj. Zapisanie pliku w innym miejscu), zapisanie pliku etapowego do innego pliku tymczasowego (git show :file > tempfile2), a następnie git-diff tempfile tempfile2. Jednak wydaje się to nieeleganckie.

Czy istnieje lepszy sposób?

+1

Dlaczego po prostu nie zapisać pliku? Co się z tym nie zgadza? –

+2

Byłoby miło uniknąć zapisywania pliku, jeśli mogę po prostu użyć potoku. –

+0

@AndyStewart: dlaczego to jest miłe? Wystarczy rzucić plik w tmp. To nie jest trudne, to nie jest dużo pracy ... na pewno dużo mniej niż próba obejścia wymagań git (ale zobacz odpowiedź Ash Berlin). – siride

Odpowiedz

2

Poprawa odpowiedzi udzielonej przez Ash Berlin.

Umożliwia to korzystanie z ładnych funkcji git-diff.

git show :file | git diff --no-index -- - temp_saved_path 

Należy pamiętać, że nadal może nie być tak wygodne, jak chcesz, ponieważ nadal trzeba napisać do pliku tymczasowego. Dopóki plik nie zostanie zapisany, zmiany w ogóle nie występują na dysku (tylko w pamięci) lub w jakimś pliku tymczasowym zależnym od edytora. Możliwe, że Vim mógłby to zrobić płynnie w jednym kroku, ale nie jestem dostatecznie zaznajomiony.

+0

Vim pozwala przekazywać zawartość do wejścia standardowego wywoływanego polecenia zewnętrznego. Teraz zapisuję indeksową wersję pliku do pliku tymczasowego i przekazuję plik w pamięci do stdin: 'git show: file> tmpfile && git diff - tmpfile -'. –

+0

Ponadto, jeśli jedna lub obie ścieżki pliku znajdują się poza repozytorium git, to '--no-index' jest automatycznie wnioskowane. –

8

Od git 1.5.1 nastąpiła opcja diff przeciwko stdin - to po prostu nie udokumentowano

$ echo foo | git diff --no-index -- my_file -

On bawi się z tym nieco bardziej zdałem sobie sprawę, to może nie być co OP (lub ja) chciał - zmienia bieżący stan pliku na stdin, a nie ostatni zatwierdzony stan pliku na standardowe wejście. Coś jak to zrobi to

$ echo foo | diff -u <(git show :my_file) -

Uwaga to oznacza wywoływanie diff bezpośrednio która może nie odebrać jakieś ustawienia w swojej git config. Zasadniczo, jak mówi ams w swojej odpowiedzi.

Powiązane problemy