Saya mengadaptasi jawaban edmondscommerce dengan menambahkan pernyataan awk sederhana yang menjumlahkan output dari for loop dan mencetak jumlahnya (dibagi dengan 1024*1024 untuk dikonversi ke Mb)
for f in `git status --porcelain | sed 's#^...##'`; do du -cs $f | head -n 1; done | sort -nr | awk ' {tot = tot+$1; print } END{ printf("%.2fMb\n",tot/(1024*1024)) }'
Perhatikan bahwa --porcelain mencetak nama path relatif ke root repo git. Jadi, jika Anda melakukan ini di subdirektori, pernyataan du tidak akan dapat menemukan file..
(whoppa; jawaban pertama saya di SoF, semoga kekuatan menyertainya)
Saya telah menggunakan versi modifikasi dari ini, karena saya memiliki file dengan spasi di dalamnya yang membuatnya macet. Saya juga tidak yakin tentang perhitungan ukuran dan menghapus head
yang tidak berguna :
git status --porcelain | sed 's/^...//;s/^"//;s/"$//' | while read path; do
du -bs "$path" ;
done | sort -n | awk ' {tot = tot+$1; print } END { printf("%.2fMB\n",tot/(1024*1024)) }'
Saya lebih suka menggunakan while
karena sedikit lebih aman daripada for
:itu masih bisa melakukan hal-hal buruk dengan file yang memiliki baris baru di dalamnya jadi saya berharap ada yang lulus null
-pisahkan file namun masih dapat menerima statusnya, tetapi saya tidak dapat menemukan cara yang bagus untuk itu.
Saya rasa saya telah menjawab pertanyaan saya sendiri:
for f in `git status --porcelain | sed 's#^...##'`; do du -cs $f | head -n 1; done | sort -nr; echo "TOTAL:"; du -cs .
Namun saya terbuka untuk ide yang lebih baik atau trik yang berguna. Output saya saat ini adalah 13GB :)
Perintah di atas pada dasarnya ada, itu memberi saya total baris demi baris dari status git tetapi tidak memberi saya jumlah total. Saat ini saya mendapatkan total semua file di bagian akhir yang tidak benar. Saya mencoba menggunakan bc
tetapi tidak dapat membuatnya berfungsi