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.