Filter git diff berdasarkan jenis perubahan

114

Apakah ada cara untuk membatasi git difffile yang diubah?

Saya ingin melihat perbedaan antara dua komit, tetapi kecualikan jalur yang tidak ada di satu atau lainnya (penambahan / penghapusan). Perl one-liner berikut menggambarkan sebagian besar dari apa yang saya inginkan:

git diff master.. | perl -lnwe 'print unless /^(new|deleted) file/../^diff/ and not /^diff/'

Tapi itu meninggalkan diff --git a/path b/pathbaris untuk file yang baru atau dihapus. Ditambah akan jauh lebih baik jika saya tidak perlu mengurai (juga gagal jika ada bingkah yang berisi sesuatu yang cocok dengan / ^ diff /, misalnya).

Alternatif lain yang saya coba adalah:

git diff --name-status (args) | perl -lnwe 'print if s/^M\s+//' | xargs git diff (args) --

Outputnya lebih baik, tapi masih terasa seperti hackish.

benizi
sumber

Jawaban:

202

Anda mencari untuk --diff-filter=Mhanya menampilkan file * M * odified antara dua cabang.

Dari man git-diff

--diff-filter=[ACDMRTUXB*]

Pilih hanya file yang ada

  • A Ditambahkan
  • C Disalin
  • D Dihapus
  • M Diubah
  • R Berganti nama
  • T jenis (mode) mereka berubah
  • U Tidak digabungkan
  • X Tidak diketahui
  • B memiliki pasangan mereka Rusak
  • * Semua-atau-tidak sama sekali

Kombinasi dari karakter filter dapat digunakan.

Ketika * (All-or-none) ditambahkan ke kombinasi, semua jalur dipilih jika ada file yang cocok dengan kriteria lain dalam perbandingan; jika tidak ada file yang sesuai dengan kriteria lain, tidak ada yang dipilih.

zen
sumber
Harap hindari kesalahan bodoh saya saat menggunakan --diff-filter = AMR untuk menghilangkan file yang dihapus: Jika Anda menghapus file 'x' maka git diff HEAD HEAD ~ 1 --name-only --diff-filter = AMR akan masih daftar 'x'. Mengapa? Karena dari HEAD menuju HEAD ~ 1 file telah ditambahkan, tidak dihapus.
Christoph Grimmer-Dietrich
2
Deskripsi untuk T membingungkan. Dari man git diff"memiliki tipenya (yaitu file biasa, symlink, submodule, ...) diubah (T),"
grimsock
Jika Anda ingin menggunakan menggunakan R(file berganti nama) Anda perlu menggunakan -Mdiperluas itu dikenal sebagai--find-renames
ccjjmartin
di mana jenis-jenis yang berbeda ini didokumentasikan? pada dasarnya, A, D, M, T, dan R itu lugas. Saya ingin tahu apa yang disiratkan C, U, X, dan B.
DanCat
Jawaban bagus dan jawaban lain menunjukkan bahwa huruf kecil berarti pengecualian. Sangat berguna untuk mengecualikan file yang dihapus.
Philippe Rathé
18

Seperti yang diingatkan oleh Git 2.10 (Q3 2016), ada cara yang lebih mudah untuk "menampilkan semuanya kecuali file yang ditambahkan / dihapus". (sebenarnya sejak Git 1.8.5, Juli 2013)

 git diff --diff-filter=ad master..

Lihat commit 16726cf (14 Jul 2016) oleh Junio ​​C Hamano ( gitster) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit 2f8c654 , 08 Agustus 2016)

diff: diff-filterpengecualian dokumen

Dalam v1.8.5 hari, 7f2ea5f ( diff: memungkinkan huruf kecil untuk menentukan kelas perubahan apa yang akan dikecualikan, 2013-07-17) mengajarkan --diff-filtermekanisme " " untuk mengambil huruf kecil sebagai pengecualian , tetapi kami lupa mendokumentasikannya.

Jadi , dokumentasidiff-options sekarang (akhirnya) meliputi:

Huruf besar ini dapat diturunkan untuk dikecualikan.
Misalnya --diff-filter=adtidak termasuk jalur yang ditambahkan dan dihapus.

VonC
sumber
4

Anda dapat menggunakan tanda --diff-filter untuk melakukan ini dengan tepat. git diff --diff-filter=CMRTUXB master..harus menunjukkan semuanya kecuali file yang ditambahkan / dihapus.

Lily Ballard
sumber
3

Untuk melihat semua file yang dimodifikasi dan baru yang dapat Anda gunakan

git diff --name-only --diff-filter=ACMR PREV_VERSION master

PREV_VERSION adalah hash dari komit pertama Anda.

Untuk mendapatkan ekspor sebagai zip, Anda dapat menggunakan kode ini

git archive --output=export.zip HEAD $(git diff --name-only --diff-filter=ACMR PREV_VERSION HEAD)

Catatan: .gitignoretidak dalamexport.zip

iwg
sumber
0

Saya telah menggunakan Notepad ++ (Windows), dan ekspresi reguler ini untuk menyaring jenis ekstensi dan jalur tertentu dari file diff.

^Index.*\.(dll|pdb|exe|txt|zip|log|ism|resx|tlog|htm|lib)$[\s\S.]*?^Index
^Index: Shared/.+$[\s\S.]*?^Index
^Index: Next/source/Utility/.+$[\s\S.]*?^Index

Satu-satunya masalah adalah, ketika itu mencapai akhir. Anda harus 'ctrl + home' dan pergi lagi sampai tidak menemukan apa-apa.

(Ganti apa yang ditemukan dengan 'Indeks')

Krzysztof Stankiewicz
sumber