Membuat git diff --stat menampilkan jalur file lengkap

104

Saat melakukan git diff --statbeberapa file terdaftar dengan jalur lengkap dari basis repositori tetapi beberapa file terdaftar sebagai:

.../short/path/to/filename.  

Itu adalah jalan yang dimulai dengan ...dan hanya jalan pendek yang ditampilkan.

Saya ingin git diffmembuat daftar path file lengkap untuk semua file agar mudah diproses oleh skrip. Apakah ada cara agar saya git diffselalu menunjukkan jalur lengkap

Badri
sumber

Jawaban:

108

The git diffperintah mengambil nilai-nilai opsional untuk --stat:

--stat[=<width>[,<name-width>[,<count>]]]
       Generate a diffstat. You can override the default output width for
       80-column terminal by --stat=<width>. The width of the filename
       part can be controlled by giving another width to it separated by a
       comma. By giving a third parameter <count>, you can limit the
       output to the first <count> lines, followed by ...  if there are
       more.

       These parameters can also be set individually with
       --stat-width=<width>, --stat-name-width=<name-width> and
       --stat-count=<count>.

(Untuk pembuatan skrip, Anda mungkin ingin menggunakannya git diff-treesecara langsung karena ini lebih merupakan perintah "pipa ledeng", meskipun saya kira Anda akan baik-baik saja. Perhatikan bahwa Anda memerlukan teks tambahan yang sama dengan --statsaat menggunakan git diff-tree. Perbedaan penting antara menggunakan git diff"porselen "ujung depan, dan git diff-treeperintah pipa ledeng, adalah yang git diffmencari pengaturan yang dikonfigurasi untuk opsi seperti diff.renamesmemutuskan apakah akan melakukan deteksi ganti nama. Nah, itu, ditambah ujung depan git diffakan melakukan hal yang sama git diff-indexjika Anda membandingkan komit dengan indeks , misalnya. Dengan kata lain, git diff membaca konfigurasi Anda dan memanggil pipa ledeng yang tepat secara otomatis .)

torek
sumber
6
git diff --numstat sama dengan diff-tree
cmcginty
1
Perhatikan bahwa untuk membatasi lebar bagian terakhir (+++ / ---) Anda dapat menggunakan --stat-graph-width=...sakelar terpisah . Perhatikan juga bahwa seting tinggi --stat-graph-width=dan --stat-name-width=tidak cukup, Anda juga harus menyetel --stat-width=cukup besar untuk menutupi keduanya.
jakub.g
@ jakub.g: poin yang bagus. Berdasarkan sedikit penggalian di sumber git, ini masuk dengan git 1.7.10.
torek
4
Apakah ada cara untuk mengglobal ini? Mengetiknya setiap kali itu gila.
Rudie
@ Rudie: sayangnya, tidak: ada variabel konfigurasi diff.statGraphWidthyang dapat Anda gunakan untuk menyetel --stat-graph-widthnilainya, tetapi yang lain default ke lebar terminal Anda. (Jadi, jawaban alternatif: "ya, buat saja jendela terminal Anda lebar 1000 kolom" :-))
torek
22

Untuk pemrosesan skrip, mungkin lebih baik menggunakan salah satu dari berikut ini:

# list just the file names
git diff --name-only
path/to/modified/file
path/to/renamed/file


# list the names and change statuses:
git diff --name-status
M       path/to/modified/file
R100    path/to/existing/file   path/to/renamed/file


# list a diffstat-like output (+ed lines, -ed lines, file name):
git diff --numstat
1       0       path/to/modified/file
0       0       path/to/{existing => renamed}/file

Masing-masing menjadi lebih berguna untuk pemrosesan skrip yang kuat saat dikombinasikan dengan -zopsi, yang digunakan NULsebagai terminator bidang.

cmbuckley.dll
sumber
Menurut pengujian saya, Anda tidak menerima jalur lengkap sumber daya menggunakan perintah ini. Untuk saat ini saya hanya melihat jalur relatif untuk file yang dihapus. Saya tidak tahu apakah ini hanya kasus untuk file-file ini.
GCallie
1
Semua output akan mengembalikan jalur relatif terhadap git rev-parse --show-toplevel. Masalah asli mengacu pada jalur yang terpotong, yang merupakan masalah di diffstats, terutama untuk nama file yang panjang atau nilai yang rendah untuk --stat-name-width. Perintah di atas tidak akan memotong jalur, tetapi akan menampilkan jalur "lengkap" seperti yang diminta, meskipun masih relatif terhadap root repositori.
cmbuckley
18

Untuk pengguna Bash, Anda dapat menggunakan $COLUMNSvariabel untuk secara otomatis mengisi lebar terminal yang tersedia:

git diff --stat=$COLUMNS

Nama jalur yang sangat panjang mungkin masih terpotong; dalam kasus ini, Anda dapat mengurangi lebar bagian +++ / --- menggunakan --stat-graph-width, misalnya ini membatasi hingga 1/5 dari lebar terminal:

git show --stat=$COLUMNS --stat-graph-width=$(($COLUMNS/5))

Untuk solusi yang lebih umum, Anda dapat menggunakan output dari tput colsuntuk menentukan lebar terminal.

John Mellor
sumber
2
Apakah ada cara untuk mengglobal --stat=$COLUMNS,$COLUMNS? Mengetiknya setiap kali itu gila.
Rudie
@ Rudie tambahkan export COLUMNSke ~/.bashrc, dan di ~/.gitconfigbawah Anda [alias], tambahkansmart-diff = ! "gitsmartdiff() { git diff $2 --stat=$COLUMNS,$COLUMNS; }; gitsmartdiff"
user151841
@ user151841 Itu hanya berubah diff. Saya ingin itu bekerja untuk merge and pulls dll juga. (Bahkan tidak dapat melakukannya secara manual di sana.) Saya rasa GIT tidak mendukungnya.
Rudie
@ Rudie Nah, setelah penarikan atau penggabungan selesai, Anda dapat membedakan antara hash sebelumnya dan yang baru.
pengguna151841
2
@ user151841 Tentu, tetapi penggabungan sudah memberikan ringkasan stat. Tanpa parameter / config. Akan lebih bagus jika semua 'ringkasan statistik' menggunakan konfigurasi yang sama.
Rudie
4

Ada pilihan --name-only: git diff --name-only. Opsi ini juga didukung oleh perintah git lain seperti showdan stash.

Jalur tidak dipersingkat dengan opsi.

Yevhen Pavliuk
sumber
0

Saya membuat alias git berikut:

diffstat = ! "gitdiffstat() {  git diff --stat=$(tput cols) ${1:-master} ; }; gitdiffstat"

Itu membaca jumlah kolom dari tput colsperintah. Secara default masterditetapkan ke diffing , tetapi Anda secara opsional dapat menentukan cabang lain.

$ git diffstat
 .gitalias | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
pengguna151841
sumber
0

Solusi sederhana yang saya temukan adalah melakukan ini: (hanya berfungsi pada * nix, maaf tidak ada osx)

git diff --stat=$COLUMNS --relative | head -n -1 | cut -c 2- | xargs -d '\n' -P4 printf "$(pwd)/%s\n"

Versi ini berfungsi untuk keduanya, tetapi tidak terlihat bagus di osx.

git diff --stat=$COLUMNS --relative | sed -e '$ d' | cut -c 2- | xargs -n4 -I{} echo "$(pwd)/{}"
Javier Buzzi
sumber
-1

Saya menemukan bahwa perilaku diff --stat berubah di suatu tempat di sekitar git 1.7.10 di mana sebelumnya itu akan mempersingkat jalur file ke lebar tetap secara default - sekarang menampilkan sebanyak yang diizinkan jendela terminal Anda. Jika Anda mengalami masalah ini, pastikan Anda meningkatkan ke 1.8.0 atau yang lebih baru.

Alex Spurling
sumber