UPDATE : OP Daniel Stutzbach menunjukkan dalam komentar bahwa perintah sederhana ini git diff-indexbekerja untuknya:
git update-index --refresh
git diff-index --quiet HEAD --
( nornagon menyebutkan dalam komentar bahwa, jika ada file yang telah disentuh, tetapi yang isinya sama dengan dalam indeks, Anda harus menjalankannya git update-index --refreshsebelumnya git diff-index, jika tidak diff-indexsecara tidak benar akan melaporkan bahwa pohon itu kotor)
Anda kemudian dapat melihat " Bagaimana cara memeriksa apakah suatu perintah berhasil? " Jika Anda menggunakannya dalam skrip bash:
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
Catatan: sebagai dikomentari oleh Anthony Sottile
git diff-index HEAD ...akan gagal pada cabang yang tidak memiliki komitmen (seperti repositori yang baru diinisialisasi).
Satu solusi yang saya temukan adalahgit diff-index $(git write-tree) ...
Dan haridsvmenunjukkan dalam komentar bahwa git diff-filespada file baru tidak mendeteksinya sebagai diff.
Pendekatan yang lebih aman tampaknya adalah menjalankan git addspesifikasi file terlebih dahulu dan kemudian gunakan git diff-indexuntuk melihat apakah ada yang ditambahkan ke indeks sebelum dijalankangit commit .
git add ${file_args} && \
git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
Dan 6502 laporan dalam komentar:
Satu masalah yang saya temui adalah yang git diff-indexakan memberi tahu bahwa ada perbedaan ketika memang tidak ada kecuali cap waktu file.
Larigit diff sekali memecahkan masalah (cukup mengejutkan, git diffsebenarnya mengubah isi kotak pasir, artinya di sini .git/index)
Masalah cap waktu ini juga dapat terjadi jika git berjalan di buruh pelabuhan .
Jawaban asli:
"Secara terprogram" berarti tidak pernah bergantung pada perintah porselen .
Selalu mengandalkan perintah pipa ledeng .
Lihat juga " Memeriksa indeks kotor atau file yang tidak dilacak dengan Git " untuk alternatif (seperti git status --porcelain)
Anda dapat mengambil inspirasi dari " require_clean_work_treefungsi " baru yang ditulis saat kita berbicara ;) (awal Oktober 2010)
require_clean_work_tree () {
# Update the index
git update-index -q --ignore-submodules --refresh
err=0
# Disallow unstaged changes in the working tree
if ! git diff-files --quiet --ignore-submodules --
then
echo >&2 "cannot $1: you have unstaged changes."
git diff-files --name-status -r --ignore-submodules -- >&2
err=1
fi
# Disallow uncommitted changes in the index
if ! git diff-index --cached --quiet HEAD --ignore-submodules --
then
echo >&2 "cannot $1: your index contains uncommitted changes."
git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2
err=1
fi
if [ $err = 1 ]
then
echo >&2 "Please commit or stash them."
exit 1
fi
}