Jak uzyskać różnicę git z pełnym kontekstem?

115

Jak stworzyć łatkę nadającą się do recenzji w tyglu?

git diff branch master --no-prefix > patch

To generuje tylko 3 linie kontekstu. Więc robię co następuje

git diff --unified=2000 branch master --no-prefix > patch

Miejmy nadzieję, że wszystkie pliki będą miały mniej niż 2000 wierszy. Czy istnieje sposób, aby powiedzieć gitowi, aby uwzględnił wszystkie linie w pliku do łatania bez konieczności określania maksymalnej liczby wierszy?

balki
źródło
3
Opublikowałem opcję -U <infinity>, aby pokazać cały plik, jako osobne pytanie stackoverflow.com/questions/28727424/…
Aleksandr Levchuk

Odpowiedzi:

55

Wiem, że to jest stare, ale nie lubię też rozwiązań zakodowanych na stałe, więc przetestowałem to:

git diff -U$(wc -l MYFILE)

Wydaje się, że użycie -U jest jedynym sposobem podejścia do problemu, ale użycie liczby wierszy obiecuje, że zadziała nawet przy niewielkiej zmianie w bardzo dużym pliku.

Ezra
źródło
1
<to nie jest konieczne. git diff -U$(wc -l MYFILE) MYFILE
balki
2
Dzięki @balki, wypróbowałem twoją sugestię i zauważyłem, że <pre> $ (wc -l MÓJ PLIK) </pre> rozwija się do liczby linii, po której następuje nazwa pliku, więc drugie użycie nazwy pliku również można pominąć. Aktualizuję odpowiedź, aby to odzwierciedlić.
Ezra
4
To różnica, istnieją dwie wersje tego pliku. A co jeśli wersja, której nie ma na dysku, była dwa razy dłuższa? Czy -U z naprawdę dużą liczbą nie jest faktycznie bezpieczniejsze?
Eloff
@Eloff, to prawda, najlepszym sposobem byłoby maksymalne zwiększenie długości, ponieważ naprawdę duże liczby nadal mają odwrotny problem. To rozwiązanie zakłada, że ​​nie dokonano żadnych ciągłych operacji usunięcia większych niż bieżący rozmiar pliku na dysku.
Ezra
3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILEjest lepszą odpowiedzią, która poprawnie analizuje wynik programu wc, pobierając tylko liczbę wierszy bez białych znaków, nie polegając na niecytowanym wyniku podpowłoki w celu utworzenia dwóch argumentów i działa w systemie macOS / BSD.
anishpatel
95

To wydaje się działać całkiem ładnie:

git diff --no-prefix -U1000

Z zastrzeżeniem:

-UFlaga określa linii kontekstu. Może być konieczne zwiększenie tej wartości, jeśli między zmianami jest więcej niż 1000 linii.

c24w
źródło
16
Proponowana -Uopcja jest taka sama, jak --unified=opcja używana przez pytającego. Jedyną różnicą jest to, że podajesz mniej wierszy kontekstu, 1000, niż użyty asker 2000. @balki chciał wiedzieć, jak zwiększyć liczbę do nieskończoności, ale sugerujesz przecięcie liczby o połowę. Czemu?
LS
4
@LS: tak, teraz zdaję sobie sprawę, ale przeoczyłem to kilka lat temu. Mimo to jest nieco bardziej oczywiste, co się dzieje, niż w pytaniu i wydaje się, że pomaga dziwnej osobie, która tu ląduje.
c24w
Dzięki za to, świetnie też działa git show!
Shakeel
@ c24w Zgoda, nadal widzę to, co chcę zobaczyć na ekranie.
Chef Pharaoh
1
Ta --no-prefixopcja usuwa przedrostki miejsc docelowych „/ a /” i „/ b /”, które pojawiają się domyślnie. (strona połączona)
Luckydonald
10

Uwaga: ogłoszenie git1.8.1rc1 (8 grudnia 2012) zawiera:

Nowa zmienna konfiguracyjna „ diff.context” może być użyta do podania domyślnej liczby linii kontekstu w wyjściu łatki, aby przesłonić zakodowaną na stałe wartość domyślną 3 linii.

to może pomóc tutaj w wygenerowaniu pełniejszego kontekstu.

VonC
źródło
7
Jednak nie ma opcji, aby powiedzieć „Wszystkie wiersze w pliku”
balki
3
Podejrzewam, że wprowadzenie dużej liczby symulowałoby „wszystkie linie”
VonC,
7
„Podejrzewam, że wprowadzenie dużej liczby symulowałoby„ wszystkie linie ”„… z wyjątkiem sytuacji, gdy tak się nie dzieje i wtedy wszystko się psuje. Wszystko jest synonimem nieskończoności, a bardzo duża liczba jest właśnie tym - liczbą, a nie nieskończonością.
Trenton
4

Mam inspirację, więc dodałem alias git.

$ cat ~/.gitconfig | fgrep diff
        df = "!git diff -U$(wc -l \"$1\" | cut -d ' ' -f 1) \"$1\""
$ git df <file>

Aktualizacja:

Właśnie stwierdziłem, że „git df” czasami nie działa z powodu zmiany katalogu podczas wykonywania aliasu git. (Zobacz aliasy git działają w złym katalogu ). Więc to jest zaktualizowana wersja:

$ cat ~/.gitconfig | fgrep df
        df = "! [ \"$GIT_PREFIX\" != \"\" ] && cd \"$GIT_PREFIX\"; ~/bin/git_df.sh"
$ 
$ cat ~/bin/git_df.sh
#!/bin/bash
for FILE in $@; do
    git diff -U$(wc -l "${FILE}" | cut -d ' ' -f 1) "${FILE}"
done
exit 0
Yun Wu
źródło
0

Wcześniej zaakceptowane rozwiązania nie działają dla mnie podczas przeglądania określonego pliku / zatwierdzenia ( -Uopcja wydaje się kłopotać z analizowaniem rev / path), ale --inter-hunk-context=działa w tym przypadku na git version 2.24.0:

git diff \
    --no-prefix \
    --inter-hunk-context=2000 \
    master -- \
        path/to/file.py

Jeśli nie znasz rozmiaru pliku, możesz go oczywiście znaleźć za pomocą wc -lzamiast kodowania na stałe:

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py
stefco
źródło