Bagaimana caranya agar diff bekerja seperti git-diff?

148

Saya suka format keluaran dari git diff. Warna dan +/ -representasi perubahan antar baris lebih mudah dibaca daripada GNU diff.

Saya dapat menjalankan git diffmenggunakan --no-indexflag di luar git repo dan berfungsi dengan baik. Namun, tampaknya tidak ada --excludeopsi untuk mengecualikan file atau subdirektori dari rekursif diff.

Apakah ada cara untuk mendapatkan yang terbaik dari kedua dunia? (opsi warna dan +/ -format git diffdan --excludeopsi GNU diff).

Saya sudah bereksperimen colordiff, tapi saya masih lebih suka format output darigit diff

Mzzzzzz
sumber
1
Untuk membuat biru untuk penambahan hijau, perubahan newtextdalam /etc/colordiff. Saya pikir git menggunakan hijau?
Rudie
1
Saya belum pernah mendengar tentang --no-flag sampai sekarang. Saya baru saja menggunakannya untuk membandingkan output dari git show dengan diff dua file - terima kasih untuk itu!
AJM-Reinstate-Monica

Jawaban:

175

Saya tidak tahu bagaimana cara membuat warna, tetapi ini akan dilakukan +/-daripada <dan >.

diff -u file1 file2
jonescb
sumber
6
Keren, ini dikombinasikan dengan colordiff membuat saya cukup dekat dengan apa yang saya inginkan. Kira saya perlu gulir lebih jauh ke bawah halaman manual waktu berikutnya ... Terima kasih!
Mzzzzzz
13
Sebuah cara sederhana untuk mendapatkan pewarnaan dengan diff -u, juga untuk pipa output ke tig, commandline git repo viewer: diff -u file1 file2 | tig.
Samuel Lampa
3
Instal colordiffdari repositori apt / yum / pacman Anda dan gunakan.
iBug
Diperlukan untuk mengaktifkan Paket Ekstra untuk Enterprise Linux (EPEL) di Amazon Linux untuk menginstal colordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
Pat Myron
1
Selain itu colordiff, Anda juga bisa mendapatkan warna dengan vimmendefinisikan cdiff() { diff -u $@ | vim -R -; }.
Syrtis Major
94

Anda juga dapat menggunakan git diff --no-index -- A B(melalui halaman manual ).

eacousineau
sumber
1
+1, tetapi sayangnya ini tidak berfungsi jika salah satu file adalah symlink.
Emil Lundberg
2
+1 Ini sangat berguna karena menunjukkan bagaimana membuat laporan git di mana dua file yang dilacak Adan Bberbeda dibandingkan satu sama lain alih - alih di mana setiap file telah dimodifikasi relatif terhadap revisi terakhir masing-masing.
J. Katzwinkel
@ EmilLundberg: bekerja untuk saya dengan symlink di git 1.9.1 di Linux. Saya tidak tahu apakah versi sebelumnya rusak.
kkm
3
git diff --no-indexmemang bagus, tetapi seperti yang ditunjukkan OP, tidak memiliki --excludebendera, jadi sering kali kegunaannya sangat terbatas.
Ken Williams
25
  1. Instal colordiff .

  2. Perbarui ~ / .colordiffrc Anda (menyalin / etc / colordiffrc Anda terlebih dahulu, jika perlu):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. Gunakan colordiff -u file1 file2untuk dua file atau colordiff -ruN path1 path2untuk membandingkan jalur secara rekursif.

Ini tidak persis sama, tetapi sangat dekat.

Steve
sumber
18

Ini yang saya sarankan dan cukup dekat

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: Anda harus menginstal ini
    • brew install colordiff di Mac saya.
    • port install colordiff pada beberapa Mac.
    • sudo apt-get install colordiff di Debian atau Ubuntu
    • Untuk platform lain, unduh sumber dari halaman utama atau GitHub dan ikuti instruksi instalasi
  • -R: ini memberitahu Less untuk menampilkan warna, bukan kode mentah.

Saya akhirnya menggunakan -wkarena saya tidak ingin melihat diff spasi putih.

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

Sunting: Seperti yang disarankan oleh @Ciprian Tomoiaga di komentar, Anda dapat membuat ini berfungsi dan memasukkannya ke ~/.bashrcfile Anda juga.

function gdiff () { diff -u $@ | colordiff | less -R; }
Nate
sumber
4
Untuk memiliki fungsi bash tunggal untuk ini tambahkan ke .bashrc:function gdiff () { diff -u $@ | colordiff | less -R; }
Ciprian Tomoiagă
4

GNU diffmemiliki --coloropsi sejak versi 3.4 pada akhir 2016 sesuai dengan jawaban ini di Unix SE. Itu bersama -uharus cukup untuk meniru output dari git diff:

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

--colorharus alwaysketika digunakan dalam pipa, autoakan mematikan warna pada pipa.

Saya hanya mencoba ini dengan Git Bash di Windows, di mana less -Rhanya akan mewarnai garis pertama dari sebongkah. less -rmemperbaikinya untuk saya dalam kasus itu.

codehearts
sumber
3

Hanya menggunakan bash, diff, tput, dan less, kita dapat erat mendekati output git diff. Akan ada beberapa perbedaan penting, karena kurangnya perhatian para diffprogrammer.

Masukkan definisi fungsi Bash berikut dalam beberapa file yang bersumber secara otomatis oleh akun pengguna Anda, dan Anda akan dapat mengakses fungsi dari baris perintah:

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
}

Fungsi ini berfungsi sebagai berikut:

  1. Pada akhirnya, diffakan dipanggil dengan berbagai opsi pemformatan untuk menentukan bagaimana perubahan dalam file akan ditampilkan.
  2. tputdigunakan untuk menyisipkan kode warna ANSI ke dalam opsi pemformatan tersebut. Perhatikan bahwa saat menggunakan terminal non-ANSI, Anda mungkin harus mengganti tput setafdengan tput setf.
  3. Output dari diffdisalurkan ke less. -Rmemungkinkan warna ANSI dipertahankan. -Xmencegah lessdari membersihkan layar saat keluar. -Fmencegah lessberoperasi sebagai pager jika output cocok dalam satu layar.
  4. Jika parameter pertama adalah @full, fungsi akan menampilkan semua baris yang tidak berubah selain baris yang ditambahkan dan dihapus.

Perhatikan perbedaan berikut antara pendekatan ini dan git diff:

  1. git diffmelaporkan tiga baris konteks seputar setiap perubahan. Sayangnya, difftampaknya mengeluh dan keluar jika Anda ingin menentukan jumlah baris konteks sementara juga secara bersamaan menentukan opsi pemformatan. (Setidaknya itu di Mac OS X Yosemite). Terima kasih diffprogrammer. Oleh karena itu, Anda dapat meminta tidak ada baris konteks di sekitar setiap perubahan, yang merupakan perilaku default, atau Anda dapat meminta agar semua baris yang tidak berubah dalam file juga dilaporkan, dengan menetapkan @fullsebagai parameter pertama.
  2. Karena garis konteks berbeda dari git diff, nomor baris yang dilaporkan oleh fungsi ini juga akan berbeda dari yang dilaporkan oleh git diff.
  3. Anda mungkin melihat adanya perubahan satu baris yang dilaporkan, yang merupakan perilaku yang benar, tetapi menjengkelkan ketika file yang diubah berisi penyisipan satu baris kosong. Saya pikir git diffberurusan dengan ini lebih baik, melalui garis konteksnya. Anda dapat mencoba melewati opsi yang berbeda diffuntuk menangani ruang putih dengan lebih baik, jika Anda mau.
Dejay Clayton
sumber
2

Anda mencari colordiff:

sudo apt-get install colordiff
Davoud Taghawi-Nejad
sumber
2

Tempatkan ini di Anda .bashrcatau .zshrc:

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

persyaratan: gitdan colordiffharus dipasang sebelumnya.

penggunaan: diff file1 file2

contoh: untuk $diff .tmux.conf .zshrc.pre-oh-my-zsh

contoh fungsi diff

himanshuxd
sumber
0

Pilihan lainnya adalah melakukannya dari luar repositori sehingga git tahu untuk membedakan antar file. misalnya. fungsi shell seperti:

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

Gunakan colordiff :

Instalasi:

sudo apt-get install colordiff

Pemakaian:

colordiff -u file_one file_two

Memberikan perbedaan yang persis sama seperti yang ditunjukkan oleh git diff.

Rakmo
sumber
0

Jika Anda tidak memiliki colordiffatau git diff, Anda bisa mendapatkan warna dengan vim.

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

atau sederhana

cdiff() { diff -u $@ | view -; }
Syrtis Major
sumber
0

Karena kelelawar memiliki pewarnaan yang bagus, saya telah menguji apakah itu berfungsi dengan baik diffdan secara mengejutkan itu bekerja dengan sangat baik di luar kotak.

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

Jadi saya kira Anda bisa membuat fungsi seperti ini di bawah ini menjadi lebih efisien:

function bdiff () { diff -u $@ | bat;}
Heechul Ryu
sumber
0

Diuji dalam debian 9 diff -u --color=always file1 file2

Tidak ada yang tahu
sumber
-2

Saya pikir pengaturan konfigurasi:

[color]
     ui = true

dikombinasikan dengan --relative=<path>opsi perintah "diff" akan melakukan apa yang Anda inginkan. Apakah kamu sudah mencoba?

Tidak ada-da
sumber
3
Ini untuk perbedaan git. Dia meminta diffopsi program
tr33hous