Nasıl git-diff gibi çalışan diff elde edilir?


153

Çıktı biçimlendirmesini beğendim git diff. Satırlar arasındaki değişikliklerin rengi ve +/ -temsili, GNU farkından daha kolay okunur.

Ben çalıştırabilirsiniz git diffkullanarak --no-indexbir git repo bayrağı dışında ve iyi çalışıyor. Ancak, --excludedosyaları veya alt dizinleri özyinelemeden hariç tutma seçeneği eksik görünüyor diff.

Her iki dünyanın da en iyisini elde etmenin bir yolu var mı? (renk seçenekleri ve +/ -formatı git diffve --excludeGNU farkının seçeneği).

Denedim colordiff, ancak yine de çıktı biçimini tercih ediyorumgit diff


1
Yeşil eklemeler, değişim için mavi yapmak için newtextde /etc/colordiff. Sanırım git yeşil kullanıyor?
Rudie

1
Şimdiye kadar - no-index bayrağını hiç duymamıştım. Bunu git show'un çıktısını iki dosyanın farkıyla karşılaştırmak için kullandım - bunun için teşekkürler!
AJM-Reinstate-Monica

Yanıtlar:


186

Rengini nasıl bilmiyorum ama bunu yapacak +/-ziyade <ve >.

diff -u file1 file2

6
Harika, bu colordiff ile birleştiğinde beni istediğime yeterince yaklaştırıyor. Sanırım bir dahaki sefere man sayfasını aşağı kaydırmam gerekiyor ... Teşekkürler!
Mzzzzzz

14
Basit bir yolu renklendirme ile diff -u almak için, boruya da tig çıkış, komut satırı git repo görüntüleyici: diff -u file1 file2 | tig.
Samuel Lampa

3
colordiffApt / yum / pacman deponuzdan yükleyin ve kullanın.
iBug

Amazon Linux'ta Enterprise Linux için Ekstra Paketlerin (EPEL) yüklenebilmesi için etkinleştirilmesi gerekiyordu colordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
Pat Myron

1
Ayrıca tanımlayarak colordiffrenk de elde edebilirsiniz . vimcdiff() { diff -u $@ | vim -R -; }
Syrtis Major

97

Ayrıca git diff --no-index -- A B( manpage üzerinden ) kullanabilirsiniz.


1
+1, ancak maalesef dosyalardan biri sembolik bağlantı ise bu işe yaramıyor.
Emil Lundberg

2
+1 Bu, her dosyanın son ilgili revizyona göre değiştirildiği yer yerine iki izlenen dosya Ave birbirleriyleB karşılaştırıldığında farklı olan git raporlarının nasıl yapılacağını gösterdiğinden çok kullanışlıdır .
J.Katzwinkel

@EmilLundberg: Linux'ta git 1.9.1'deki symlink'lerle benim için çalışıyor. Önceki sürümlerin bozuk olup olmadığını bilmiyorum.
kkm

3
git diff --no-indexharika, ancak OP'nin de belirttiği gibi --excludebayraktan yoksun , bu yüzden çoğu zaman çok sınırlı kullanışlı.
Ken Williams

25
  1. Colordiff'i yükleyin .

  2. ~ / .Colordiffrc dosyanızı güncelleyin (gerekirse önce / etc / colordiffrc kopyalayın):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. colordiff -u file1 file2İki dosya için veya colordiff -ruN path1 path2yolları yinelemeli olarak karşılaştırmak için kullanın .

Tam olarak aynı değil ama çok yakın.


18

Bu benim önerdiğim ve oldukça yakın

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: Bunu yüklemeniz gerekecek
  • -R: bu Less'e ham kodlar yerine renkleri göstermesini söyler.

Sonunda kullandım -wçünkü beyaz boşluk farklarını görmek istemedim.

diff -w -u FILE1 FILE2 | colordiff | less -R

Düzenleme: @Ciprian Tomoiaga tarafından yorumda önerildiği gibi, bunu bir işlev haline getirebilir ve ~/.bashrcdosyanıza da koyabilirsiniz .

function gdiff () { diff -u $@ | colordiff | less -R; }

4
Bunun için tek bir bash işlevine sahip olmak için function gdiff () { diff -u $@ | colordiff | less -R; }
.bashrc'ye

7

Unix SE'deki bu yanıta göre GNU'nun 2016 sonundaki 3.4 sürümünden beri diffbir --colorseçeneği var . Bu , aşağıdakilerin çıktısını taklit etmek için yeterli olmalıdır :-ugit diff

diff -u --color=always file1 file2 | less -r

--coloralwaysbir boruda kullanıldığında olmalı ,auto , borularda rengi kapatır.

Bunu yalnızca Windows'ta Git Bash ile denedim, burada less -Ryalnızca bir parçanın ilk satırını renklendirebilirdi. less -rbu durumda benim için düzeltti.


3

Sadece kullanma bash, diff, tput, ve less, yakından çıktısını yaklaşık olarak belirleyebilir git diff. Yine de, kısa görüşlülük nedeniyle bazı önemli farklılıklar olacaktır.diff programcıların .

Kullanıcı hesabınız tarafından otomatik olarak elde edilen bir dosyaya aşağıdaki Bash işlev tanımını koyun ve işleve komut satırından erişebileceksiniz:

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

Bu işlev şu şekilde çalışır:

  1. Sonuçta, diffdosyalardaki değişikliklerin nasıl görüntüleneceğini belirtmek için çeşitli biçimlendirme seçenekleriyle çağrılır.
  2. tputbu biçimlendirme seçeneklerine ANSI renk kodlarını eklemek için kullanılır. ANSI olmayan terminallerde, değiştirmek gerekebilir Not tput setafile tput setf.
  3. Çıkış diffborulu less. -RANSI renklerinin korunmasına izin verir. çıkarken ekranın temizlenmesini -Xengeller less. çıktı bir ekrana sığarsa çağrı cihazı olarak çalışmasını -Fengeller less.
  4. İlk parametre ise @full, işlev eklenen ve çıkarılan satırlara ek olarak tüm değiştirilmemiş satırları görüntüler.

Bu yaklaşım ve aşağıdakiler arasındaki aşağıdaki farklara dikkat edin git diff:

  1. git diffher değişikliği çevreleyen üç satır bağlam bildirir. Maalesef, diffaynı anda biçimlendirme seçeneklerini belirlerken aynı zamanda bağlam satırlarının sayısını belirtmek istiyorsanız şikayet ediyor ve çıkıyorsunuz. (En azından Mac OS X Yosemite'de öyle). Teşekkürler diffprogramcılar. Bu nedenle, varsayılan davranış olan her değişikliği çevreleyen bağlam satırı isteyebilir veya @fullilk parametre olarak belirterek dosyadaki tüm değişmemiş satırların da rapor edilmesini isteyebilirsiniz .
  2. Bağlam çizgileri farklı olduğundan, git diffbu işlev tarafından bildirilen satır numaraları da tarafından bildirilenlerden farklı olacaktır.git diff .
  3. Tek satırlık değişikliklerin rapor edildiğini görebilirsiniz, bu doğru davranıştır, ancak değiştirilen dosyanız tek boş satırların eklenmesini içerdiğinde can sıkıcıdır. Bence bunu git diffbağlam çizgileri üzerinden daha iyi ele alıyor. İsterseniz diff, beyaz boşluklarla daha iyi başa çıkmak için farklı seçenekler aktarmayı deneyebilirsiniz .


2

Bunu .bashrcveya .zshrc:

diff() { git diff --no-index "$1" "$2" | colordiff; }

gereksinimler: gitve colordiffönceden kurulmalıdır.

kullanım: diff file1 file2

örnek: $ içindiff .tmux.conf .zshrc.pre-oh-my-zsh

diff işlevi örneği


0

Diğer seçenek ise bunu havuzun dışından yapmaktır, böylece git dosyalar arasında fark olduğunu bilir. Örneğin. bir kabuk şu şekilde işlev görür:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}

0

Colordiff kullan :

Kurulum:

sudo apt-get install colordiff

Kullanım:

colordiff -u file_one file_two

İle gösterildiği gibi tam olarak aynı farkı verir git diff.


0

Ya da colordiffyoksa git diff, renklendirebilirsin vim.

cdiff() { diff -u $@ | vim -R -; }

ya da sadece

cdiff() { diff -u $@ | view -; }

0

Yana yarasa güzel colorizing vardır o eserler, ben test ettik diffçok ve şaşırtıcı kutunun dışında gerçekten iyi çalıştı.

$ diff file1 file2 | bat veya $ diff -u file1 file2 | bat

Öyleyse, daha verimli olması için aşağıdaki gibi bir işlevi yapabileceğinizi düşünüyorum:

function bdiff () { diff -u $@ | bat;}


-2

Bence yapılandırma ayarı:

[color]
     ui = true

"diff" komutunun --relative=<path>seçeneği ile birleştiğinde istediğini yapardı. Denedin mi ?


3
Bu fark için git. diffProgram seçeneklerini soruyordu
tr33hous
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.