Bagaimana cara mendapatkan git diff dengan konteks lengkap?

114

Bagaimana cara membuat tambalan yang cocok untuk ditinjau dalam wadah?

git diff branch master --no-prefix > patch

Ini hanya menghasilkan 3 baris konteks. Jadi saya melakukan hal berikut

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

Semoga semua file memiliki kurang dari 2000 baris. Apakah ada cara untuk memberi tahu git agar menyertakan semua baris di file untuk patch tanpa harus menentukan baris maksimum?

balki
sumber
3
Saya memposting opsi -U <infinity> untuk menampilkan seluruh file, sebagai pertanyaan terpisah stackoverflow.com/questions/28727424/…
Aleksandr Levchuk

Jawaban:

54

Saya tahu ini sudah lama, tetapi saya juga tidak menyukai solusi hard-code, jadi saya menguji ini:

git diff -U$(wc -l MYFILE)

Menggunakan -U tampaknya menjadi satu-satunya cara untuk mengatasi masalah, tetapi menggunakan jumlah baris menjanjikan bahwa ini akan berfungsi bahkan untuk perubahan kecil dalam file yang sangat besar.

Ezra
sumber
1
<tidak perlu. git diff -U$(wc -l MYFILE) MYFILE
balki
2
Terima kasih @balki, saya mencoba saran Anda dan melihat bahwa <pre> $ (wc -l MYFILE) </pre> meluas ke jumlah baris diikuti dengan nama file, sehingga penggunaan kedua nama file juga dapat dihilangkan. Saya memperbarui jawaban saya untuk mencerminkan ini.
Ezra
4
Ini adalah perbedaan, ada dua versi file. Bagaimana jika versi yang tidak ada pada disk dua kali lebih lama? Bukankah -U dengan jumlah yang sangat besar sebenarnya lebih aman?
Eloff
@Eloff, itu benar, cara terbaik adalah dengan memaksimalkan panjangnya, karena angka yang sangat besar masih memiliki masalah yang berlawanan. Solusi ini mengasumsikan bahwa tidak ada penghapusan bersebelahan yang lebih besar dari ukuran file saat ini pada disk yang dibuat.
Ezra
3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILEadalah jawaban yang lebih baik yang mengurai output wcdengan benar dengan hanya mendapatkan jumlah baris tanpa spasi, tidak bergantung pada output subkulit yang tidak dikutip untuk membuat dua argumen, dan berfungsi pada macOS / BSD.
anishpatel
94

Ini sepertinya bekerja dengan cukup baik:

git diff --no-prefix -U1000

Dengan peringatan:

The -Ubendera menentukan baris dari konteks. Anda mungkin perlu meningkatkannya jika ada lebih dari 1000 garis di antara perubahan Anda.

c24w
sumber
16
The -Upilihan Anda sarankan adalah sama dengan --unified=pilihan yang digunakan oleh penanya. Satu-satunya perbedaan adalah Anda menentukan lebih sedikit baris konteks, 1000, daripada penanya yang digunakan, 2000. @balki ingin tahu bagaimana cara meningkatkan angka hingga tak terbatas, namun Anda menyarankan untuk memotong angka menjadi dua. Mengapa?
LS
4
@LS: ya, saya menyadarinya sekarang, tetapi mengabaikannya beberapa tahun yang lalu. Namun, itu sedikit lebih jelas apa yang terjadi daripada di pertanyaan dan tampaknya membantu orang aneh yang mendarat di sini.
c24w
Terima kasih untuk ini, ini juga berfungsi dengan baik git show!
Shakeel
@ c24w Setuju, masih menampilkan apa yang ingin saya lihat di layar.
Chef Pharaoh
1
The --no-prefixpilihan menghilangkan awalan “/ a /” dan “/ b /” tujuan yang muncul secara default. (halaman tertaut)
luckydonald
10

Catatan: git1.8.1rc1 announce (8 Desember 2012) meliputi:

Variabel konfigurasi baru " diff.context" dapat digunakan untuk memberikan jumlah baris konteks default dalam keluaran tambalan, untuk menimpa default 3 baris yang di-hardcode.

sehingga bisa membantu, di sini, menghasilkan konteks yang lebih lengkap.

VonC
sumber
7
Namun itu tidak memiliki opsi untuk mengatakan 'Semua baris dalam file'
balki
3
Saya menduga bahwa menempatkan sejumlah besar, itu akan mensimulasikan "semua garis"
VonC
7
"Saya menduga bahwa menempatkan sejumlah besar, itu akan mensimulasikan" semua baris "" ... kecuali jika tidak dan kemudian semuanya rusak. Semua identik dengan ketidakterbatasan, dan angka yang sangat besar hanyalah itu - angka, bukan tak terhingga.
Trenton
4

Mendapat inspirasi dan jadi saya menambahkan alias git.

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

Memperbarui:

Baru saja ditemukan "git df" terkadang tidak berfungsi, karena direktori berubah saat menjalankan alias git. (Lihat alias git beroperasi di direktori yang salah ). Jadi ini adalah versi yang diperbarui:

$ 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
sumber
0

Sebelumnya diterima solusi tidak bekerja untuk saya saat melihat spesifik file / komit (yang -Upilihan tampaknya berantakan dengan rev / path parsing), tapi --inter-hunk-context=karya-karya dalam hal ini di git version 2.24.0:

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

Jika Anda tidak mengetahui ukuran file, tentu saja Anda dapat menemukannya dengan wc -lalih - alih melakukan hard-coding:

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py
stefco
sumber