Dalam Makefile, saya ingin melakukan tindakan tertentu jika ada perubahan yang tidak dikomit (baik di pohon kerja atau indeks). Apa cara paling bersih dan paling efisien untuk melakukan itu? Perintah yang keluar dengan nilai pengembalian nol dalam satu kasus dan bukan-nol di yang lain akan sesuai dengan tujuan saya.
Saya dapat menjalankan git status
dan menyalurkan output grep
, tetapi saya merasa harus ada cara yang lebih baik.
Jawaban:
UPDATE : OP Daniel Stutzbach menunjukkan dalam komentar bahwa perintah sederhana ini
git diff-index
bekerja untuknya:( nornagon menyebutkan dalam komentar bahwa, jika ada file yang telah disentuh, tetapi yang isinya sama dengan dalam indeks, Anda harus menjalankannya
git update-index --refresh
sebelumnyagit diff-index
, jika tidakdiff-index
secara 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:
Catatan: sebagai dikomentari oleh Anthony Sottile
Dan
haridsv
menunjukkan dalam komentar bahwagit diff-files
pada file baru tidak mendeteksinya sebagai diff.Pendekatan yang lebih aman tampaknya adalah menjalankan
git add
spesifikasi file terlebih dahulu dan kemudian gunakangit diff-index
untuk melihat apakah ada yang ditambahkan ke indeks sebelum dijalankangit commit
.Dan 6502 laporan dalam komentar:
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_tree
fungsi " baru yang ditulis saat kita berbicara ;) (awal Oktober 2010)sumber
git diff-index --quiet HEAD
.HEAD
di direktori kerja. Lebih baik digunakangit diff-index --quiet HEAD --
.git status --help
negara: --porcelain Berikan output dalam format skrip yang mudah diurai. Ini mirip dengan keluaran pendek, tetapi akan tetap stabil di versi Git dan terlepas dari konfigurasi pengguna. Lihat di bawah untuk detailnya.Sementara solusi lain sangat menyeluruh, jika Anda menginginkan sesuatu yang sangat cepat dan kotor, coba sesuatu seperti ini:
Itu hanya memeriksa apakah ada output dalam ringkasan status.
sumber
[[ ... ]]
sebenarnya dilakukan sintaks? Saya belum pernah melihat yang seperti itu sebelumnya.git status
sebenarnya diabaikan dalam tes ini. Ini hanya terlihat pada output. Lihat halaman terkait bash ini untuk info lebih lanjut tentang[
,[[
dan bagaimana pengujian bekerja di bash.--porcelain
parameter seperti yang ditunjukkan di sinigit status -s -uall
untuk memasukkan file yang tidak terlacak.git diff --exit-code
akan mengembalikan nol jika ada perubahan;git diff --quiet
sama dengan tanpa output. Karena Anda ingin memeriksa pohon kerja dan indeks, gunakanAtau
Salah satu akan memberi tahu Anda jika ada perubahan yang tidak dikomit yang dipentaskan atau tidak.
sumber
git diff --quite HEAD
hanya akan memberi tahu Anda apakah pohon yang bekerja bersih, bukan apakah indeksnya bersih. Misalnya, jikafile
diubah antara HEAD ~ dan HEAD, maka setelahgit reset HEAD~ -- file
itu, ia akan tetap keluar 0 meskipun ada perubahan bertahap yang ada dalam indeks (wt == HEAD, tetapi index! = HEAD).git diff --quiet && git diff --cached --quiet
.Memperluas jawaban @ Nepthar:
sumber
$(git status -s "$file")
dan kemudian dalamelse
klausagit add "$file"; git commit -m "your autocommit process" "$file"
git status -s
sebagaigit status --porcelain ; git clean -nd
gantinya, direktori sampah akan muncul di sini juga, yang tidak terlihatgit status
.Seperti yang ditunjukkan dalam jawaban lain, sesederhana perintah seperti itu sudah cukup:
Jika Anda menghilangkan dua tanda hubung terakhir, perintah akan gagal jika Anda memiliki file bernama
HEAD
.Contoh:
Kata peringatan: perintah ini mengabaikan file yang tidak terlacak.
sumber
git add
dangit clean
untuk menyelamatkanSaya membuat beberapa alias git yang berguna untuk membuat daftar file yang tidak dipentaskan dan dipentaskan:
Maka Anda dapat dengan mudah melakukan hal-hal seperti:
Anda dapat membuatnya lebih mudah dibaca dengan menciptakan suatu tempat script pada Anda
PATH
disebutgit-has
:Sekarang contoh di atas dapat disederhanakan menjadi:
Untuk kelengkapan di sini adalah alias yang serupa untuk file yang tidak dilacak dan diabaikan:
sumber
Dengan python dan paket GitPython:
Mengembalikan True jika repositori tidak bersih
sumber
LOGLEVEL=DEBUG
Anda akan melihat semua perintah Popen yang digunakan untuk menjalankangit diff
Inilah cara terbaik dan terbersih.
sumber
git status
adalah perintah 'porselen'. Jangan gunakan perintah porselen dalam skrip karena skrip dapat berubah di antara versi git. Alih-alih menggunakan perintah 'plumbing'.git status --porcelain
(yang dimaksudkan untuk tujuan ini - format stabil yang dapat Anda parsing dalam skrip), mungkin juga dengan -z (null-separated bukan newline?), Anda dapat melakukan sesuatu yang berguna dengan ide ini . @ codyc4321 lihat stackoverflow.com/questions/6976473/... untuk detail