Kunci untuk “scripting” Git yang andal adalah menggunakan perintah 'plumbing'.
Pengembang berhati-hati ketika mengubah perintah plumbing untuk memastikan mereka menyediakan antarmuka yang sangat stabil (yaitu kombinasi yang diberikan keadaan repositori, stdin, opsi baris perintah, argumen, dll. Akan menghasilkan output yang sama di semua versi Git di mana perintah / opsi ada). Variasi keluaran baru dalam perintah plumbing dapat diperkenalkan melalui opsi baru, tetapi itu tidak dapat memperkenalkan masalah untuk program yang telah ditulis terhadap versi yang lebih lama (mereka tidak akan menggunakan opsi baru, karena tidak ada (atau setidaknya ada tidak digunakan) pada saat skrip ditulis).
Sayangnya perintah Git 'sehari-hari' adalah perintah 'porselen', sehingga sebagian besar pengguna Git mungkin tidak terbiasa dengan perintah pipa ledeng. Perbedaan antara perintah porselen dan pipa ledeng dibuat di halaman utama git (lihat subbagian berjudul Perintah tingkat tinggi (porselen) dan perintah tingkat rendah (pipa ledeng) .
Untuk mengetahui tentang perubahan yang tidak dikomit, Anda mungkin perlu git diff-index(membandingkan indeks (dan mungkin melacak bit pohon kerja) dengan beberapa pohon lain (misalnya HEAD)), mungkin git diff-files(membandingkan pohon kerja dengan indeks), dan mungkin git ls-files(daftar file, misalnya daftar tidak terlacak , file tidak ditandai).
(Perhatikan bahwa dalam perintah di bawah ini, HEAD --digunakan sebagai ganti HEADkarena jika tidak, perintah gagal jika ada file bernama HEAD.)
Untuk memeriksa apakah repositori telah melakukan perubahan (belum berkomitmen) gunakan ini:
git diff-index --quiet --cached HEAD --
- Jika keluar dengan
0maka tidak ada perbedaan ( 1berarti ada perbedaan).
Untuk memeriksa apakah pohon yang bekerja memiliki perubahan yang dapat dipentaskan:
git diff-files --quiet
- Kode keluar sama dengan untuk
git diff-index( 0== tidak ada perbedaan; 1== perbedaan).
Untuk memeriksa apakah kombinasi indeks dan file yang dilacak di pohon kerja memiliki perubahan sehubungan dengan HEAD:
git diff-index --quiet HEAD --
- Ini seperti kombinasi dari dua sebelumnya. Satu perbedaan utama adalah bahwa itu masih akan melaporkan "tidak ada perbedaan" jika Anda memiliki perubahan bertahap bahwa Anda telah "membatalkan" di pohon kerja (kembali ke konten yang ada di
HEAD). Dalam situasi yang sama ini, kedua perintah yang terpisah akan menghasilkan laporan "perbedaan yang ada".
Anda juga menyebutkan file yang tidak dilacak. Anda mungkin berarti "tidak terlacak dan tidak ditandai", atau Anda mungkin berarti "tidak terlacak" (termasuk file yang diabaikan). Apa pun itu, git ls-filesadalah alat untuk pekerjaan itu:
Untuk "tidak terlacak" (akan menyertakan file yang diabaikan, jika ada):
git ls-files --others
Untuk "tidak terlacak dan tidak ditandai":
git ls-files --exclude-standard --others
Pikiran pertama saya adalah memeriksa apakah perintah ini memiliki output:
test -z "$(git ls-files --others)"
- Jika keluar dengan
0maka tidak ada file yang tidak terlacak. Jika keluar 1maka ada file yang tidak terlacak.
Ada kemungkinan kecil bahwa ini akan menerjemahkan keluar abnormal dari git ls-filesmenjadi "tidak ada file terlacak" laporan (keduanya menghasilkan keluar tidak nol dari perintah di atas). Versi yang sedikit lebih kuat mungkin terlihat seperti ini:
u="$(git ls-files --others)" && test -z "$u"
- Idenya sama dengan perintah sebelumnya, tetapi memungkinkan kesalahan yang tidak terduga
git ls-filesuntuk menyebar. Dalam hal ini, jalan keluar yang tidak nol dapat berarti “ada file yang tidak dilacak” atau itu bisa berarti kesalahan terjadi. Jika Anda ingin hasil "kesalahan" dikombinasikan dengan hasil "tidak ada file yang tidak terlacak", gunakan test -n "$u"(di mana keluar 0berarti "beberapa file yang tidak terlacak", dan bukan-nol berarti kesalahan atau "tidak ada file yang tidak dilacak").
Gagasan lain adalah menggunakan --error-unmatchuntuk menyebabkan keluar non-nol ketika tidak ada file yang tidak terlacak. Ini juga berisiko menyatukan "tidak ada file yang tidak dilacak" (keluar 1) dengan "terjadi kesalahan" (keluar bukan nol, tapi mungkin 128). Tetapi memeriksa untuk kode keluar 0vs. 1vs bukan nol mungkin cukup kuat:
git ls-files --others --error-unmatch . >/dev/null 2>&1; ec=$?
if test "$ec" = 0; then
echo some untracked files
elif test "$ec" = 1; then
echo no untracked files
else
echo error from ls-files
fi
Salah satu git ls-filescontoh di atas dapat diambil --exclude-standardjika Anda ingin mempertimbangkan hanya file yang tidak terlacak dan tidak di-retensi.