Tam bağlamla git diff nasıl elde edilir?


115

Potada incelemeye uygun yama nasıl oluşturulur?

git diff branch master --no-prefix > patch

Bu, yalnızca 3 satır bağlam oluşturur. Ben de şunu yapıyorum

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

Umarım tüm dosyalar 2000'den az satıra sahip olur. Git'e yama için dosyadaki tüm satırları maksimum satır belirtmek zorunda kalmadan eklemesini söylemenin bir yolu var mı?


3
Tüm dosyayı ayrı bir soru olarak göstermek için -U <infinity> seçeneğini yayınladım stackoverflow.com/questions/28727424/…
Aleksandr Levchuk

Yanıtlar:


55

Bunun eski olduğunu biliyorum, ancak sabit kodlu çözümlerden de hoşlanmıyorum, bu yüzden bunu test ettim:

git diff -U$(wc -l MYFILE)

-U kullanmak, soruna yaklaşmanın tek yolu gibi görünüyor, ancak bir satır sayısı kullanmak, çok büyük bir dosyada küçük bir değişiklik için bile işe yarayacağını vaat ediyor.


1
<gerekli değil. git diff -U$(wc -l MYFILE) MYFILE
balki

2
Teşekkürler @balki, önerinizi denedim ve <pre> $ (wc -l MYFILE) </pre> 'in satır sayısına ve ardından dosya adına genişlediğini fark ettim, böylece dosya adının ikinci kullanımı da atlanabilir. Cevabımı bunu yansıtacak şekilde güncelliyorum.
Ezra

4
Bu bir fark, dosyanın iki versiyonu var. Ya diskte olmayan sürüm iki kat daha uzunsa? Gerçekten büyük bir sayıya sahip -U daha güvenli değil mi?
Eloff

@Eloff, bu doğru, en iyi yol uzunlukları en üst düzeye çıkarmaktır, çünkü gerçekten büyük sayılarda hala tersi sorun var. Bu çözüm, diskteki geçerli dosya boyutundan daha büyük bitişik silme işlemlerinin yapılmadığını varsayar.
Ezra

3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILEwciki bağımsız değişken oluşturmak için bir alt kabuğun alıntılanmamış çıktısına güvenmeden, yalnızca boşluksuz satır sayısını alarak çıktısını doğru şekilde ayrıştıran daha iyi bir cevaptır ve macOS / BSD üzerinde çalışır.
anishpatel

95

Bu oldukça iyi çalışıyor gibi görünüyor:

git diff --no-prefix -U1000

Uyarı ile:

-UBayrak bağlamın hatlarını belirler. Değişiklikleriniz arasında 1000'den fazla satır varsa bunu artırmanız gerekebilir.


16
-UEğer önermek seçenek aynıdır --unified=asker tarafından kullanılan seçenek. Tek fark, soruyu soranın 2000 kullandığından daha az bağlam satırı (1000) belirlemenizdir. @Balki sayıyı nasıl sonsuza çıkaracağını bilmek istedi, ancak siz sayıyı yarıya indirmeyi öneriyorsunuz. Neden?
LS

4
@LS: Evet, şimdi anladım, ancak birkaç yıl önce bunu gözden kaçırdım. Yine de, neler olup bittiği sorudakinden biraz daha belirgindir ve buraya gelen tuhaf kişiye yardım ediyor gibi görünüyor.
c24w

Bunun için teşekkürler, aynı zamanda harika çalışıyor git show!
Shakeel

@ c24w Kabul edildi, hala ekranda görmek istediklerimi bana veriyor.
Chef Pharaoh

1
--no-prefixSeçenek varsayılan olarak göstermek “/ a /” ve “/ b /” hedef alan kodlarının kurtulur. (bağlantılı sayfa)
luckydonald

10

Not: git1.8.1rc1 duyuru (8 Aralık 2012) şunları içerir:

Yeni bir yapılandırma değişkeni " diff.context", 3 satırın sabit kodlanmış varsayılanını geçersiz kılmak için yama çıktısında varsayılan bağlam satırı sayısını vermek için kullanılabilir.

bu, burada daha eksiksiz bir bağlam oluşturmaya yardımcı olabilir.


7
Yine de bunun 'Dosyadaki tüm satırlar' deme seçeneği yok
balki

3
Büyük bir sayı koymanın "tüm çizgileri" simüle edeceğinden şüpheleniyorum
VonC

7
"Büyük bir sayı koymanın" tüm çizgileri "simüle edeceğinden şüpheleniyorum ... aksi ve sonra bir şeyler kırılmadığı sürece. Hepsi sonsuzla eş anlamlıdır ve çok büyük bir sayı sadece budur - sonsuz değil, bir sayıdır.
Trenton

4

İlham aldım ve bu yüzden bir git takma adı ekledim.

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

Güncelleme:

Git diğer adı çalıştırılırken dizin değişikliği nedeniyle bazen "git df" çalışmıyor bulundu. ( Git takma adlarının yanlış dizinde çalışmasına bakın ). Yani bu güncellenmiş versiyon:

$ 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


0

Önceden kabul edilmiş çözümler, belirli bir dosya / işlem görüntülerken benim için işe yaramıyor ( -Useçenek, rev / yol ayrıştırma ile karışıyor gibi görünüyor), ancak --inter-hunk-context=bu durumda şu durumda işe yarıyor git version 2.24.0:

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

Dosya boyutunu bilmiyorsanız, wc -lsabit kodlamak yerine elbette bulabilirsiniz :

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.