Tujuannya adalah untuk mendapatkan status tidak ambigu yang dapat dievaluasi dalam perintah shell.
Saya mencoba git status
tetapi selalu mengembalikan 0, bahkan jika ada item yang dikomit.
git status
echo $? #this is always 0
Saya punya ide tapi saya pikir itu ide yang buruk.
if [ git status | grep -i -c "[a-z]"> 2 ];
then
code for change...
else
code for nothing change...
fi
ada cara lain?
perbarui dengan pemecahan berikut, lihat posting Mark Longair
Saya mencoba ini tetapi menyebabkan masalah.
if [ -z $(git status --porcelain) ];
then
echo "IT IS CLEAN"
else
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
echo git status
fi
Saya mendapatkan kesalahan berikut [: ??: binary operator expected
sekarang, saya melihat pria itu dan mencoba git diff.
=================== kode untuk harapan saya, dan berharap jawaban yang lebih baik ======================
#if [ `git status | grep -i -c "$"` -lt 3 ];
# change to below code,although the above code is simple, but I think it is not strict logical
if [ `git diff --cached --exit-code HEAD^ > /dev/null && (git ls-files --other --exclude-standard --directory | grep -c -v '/$')` ];
then
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
exit 1
else
exit 0
fi
git
git-status
9nix00
sumber
sumber
$(git status --porcelain)
. Juga, jika Anda ingin menempatkan tanda seru dalam pesan Anda, Anda harus menggunakan tanda kutip tunggal daripada tanda kutip ganda - yaitu harusecho 'PLEASE COMMIT YOUR CHANGE FIRST!!!'
sebaliknya$(git status --porcelain)
, seperti yang saya katakan!Jawaban:
Alternatif untuk menguji apakah output
git status --porcelain
kosong adalah dengan menguji setiap kondisi yang Anda pedulikan secara terpisah. Seseorang mungkin tidak selalu peduli, misalnya, jika ada file yang tidak terlacak dalam output darigit status
.Misalnya, untuk melihat apakah ada perubahan lokal yang tidak dipentaskan, Anda dapat melihat kode pengembalian:
Untuk memeriksa apakah ada perubahan yang dilakukan tetapi tidak dilakukan, Anda dapat menggunakan kode pengembalian:
Akhirnya, jika Anda ingin tahu tentang apakah ada file yang tidak dilacak di pohon kerja Anda yang tidak diabaikan, Anda dapat menguji apakah output dari perintah berikut ini kosong:
Pembaruan: Anda bertanya di bawah ini apakah Anda dapat mengubah perintah itu untuk mengecualikan direktori dalam output. Anda dapat mengecualikan direktori kosong dengan menambahkan
--no-empty-directory
, tetapi untuk mengecualikan semua direktori dalam output itu saya pikir Anda harus memfilter output, seperti dengan:The
-v
untukegrep
sarana untuk hanya output baris yang tidak cocok dengan pola, dan pola cocok setiap baris yang berakhir dengan/
.sumber
--quiet
(yang menyiratkan--exit-code
) juga membisukan output, bagi mereka yang hanya ingin kode keluar.Nilai balik
git status
hanya memberi tahu Anda kode keluargit status
, bukan jika ada modifikasi yang harus dilakukan.Jika Anda ingin versi yang lebih mudah dibaca dari komputer
git status
, cobaLihat deskripsi
git status
untuk informasi lebih lanjut tentang itu.Penggunaan sampel (skrip hanya menguji jika
git status --porcelain
memberikan output apa pun, tidak perlu penguraian):Harap dicatat bahwa Anda harus mengutip string untuk diuji, yaitu output dari
git status --porcelain
. Untuk petunjuk lebih lanjut tentang konstruksi tes, lihat Panduan Script Bash Lanjutan ( perbandingan string Bagian ).sumber
|| echo no
substitusi perintah sehingga ruang kerja tidak salah dilaporkan bersih jikagit status
gagal secara mendasar. Juga, kode Anda (terpuji) kompatibel dengan POSIX, tetapi karena Anda menautkan ke panduan bash, izinkan saya menambahkan bahwa jika Anda menggunakan bash,[[ ... ]]
bukan yang kompatibel dengan POSIX[ ... ]
, Anda tidak perlu membuat penawaran kutip ganda substitusi perintah (meskipun tidak ada salahnya):[[ -z $(git status --porcelain) ]]
.Jika Anda seperti saya, Anda ingin tahu apakah ada:
1) perubahan pada file yang ada 2) file yang baru ditambahkan 3) file yang dihapus
dan secara khusus tidak ingin tahu tentang 4) file yang tidak terlacak.
Ini harus dilakukan:
Inilah kode bash saya untuk keluar dari skrip jika repo bersih. Ini menggunakan versi pendek dari opsi file yang tidak dilacak:
sumber
—untracked-files=no
; Saya pikir tes Anda dapat disederhanakan[[ -z $(git status --untracked-files=no --porcelain) ]]
.git status
seharusnya tidak menulis ke stderr, kecuali sesuatu yang fundamental beres - dan kemudian Anda tidak ingin melihat output itu. (Jika Anda menginginkan perilaku yang lebih kuat dalam peristiwa itu, tambahkan|| echo no
substitusi perintah sehingga pengujian kebersihan masih gagal). Perbandingan string /-z
operator dapat menangani string multi-line - tidak perlutail
.[[ -z $(git status -u no --porcelain) ]]
[[ -z $(git status -uno --porcelain) ]]
Sangat mungkin untuk menggabungkan
git status --porcelain
dengan sederhanagrep
untuk melakukan tes.Saya menggunakan ini sebagai kalimat sederhana:
Tambahkan
-qs
ke perintah grep Anda untuk membuatnya diam.sumber
git status
gagal fatal (misalnya, repo rusak), tes Anda akan keliru melaporkan ruang kerja yang bersih . Salah satu opsi adalah menggunakangit status --porcelain 2>&1
, tetapi itu akan 'memakan' pesan kesalahan jika Anda menggunakan grep with-q
. (Berurusan dengan yang akan kehilangan keanggunan:(git status --porcelain || echo err) | grep -q .
)test -z "$(git status --porcelain)" || git pull origin master
Dari kode sumber git ada skrip sh yang mencakup yang berikut.
Cuplikan ini menunjukkan bagaimana kemungkinannya untuk menggunakan
git diff-files
dangit diff-index
untuk mengetahui apakah ada perubahan pada file yang diketahui sebelumnya. Namun itu tidak memungkinkan Anda untuk mengetahui apakah file baru yang tidak dikenal telah ditambahkan ke pohon kerja.sumber
if [ -n "$(git ls-files --others --exclude-standard)" ]
tanpa ada pemipaan atau penyapuan tambahan harus cukup untuk mendeteksi file yang tidak terlacak.Saya akan melakukan tes ini:
atau ini menjadi eksplisit:
dimana:
--exit-code
Buat program keluar dengan kode yang mirip dengan diff (1). Artinya, ia keluar dengan 1 jika ada perbedaan dan 0 berarti tidak ada perbedaan.
--diam
Nonaktifkan semua output program. Menyiratkan --exit-code
sumber
Saya agak terlambat dalam diskusi, tetapi jika hanya Anda perlu memiliki kode keluar 0 jika
git status --porcelain
tidak mengembalikan apa pun dan! = 0 lainnya, coba ini:Ini akan membuat jumlah baris menjadi kode keluar, dengan risiko mendapatkan masalah ketika ada lebih dari 255 baris. Begitu
akan menjelaskan hal itu;)
sumber
Saya menggunakan ini dalam skrip untuk memiliki:
1 ketika ada file yang berbeda atau tidak terlacak
[-z "$ (status git --porcelain)"]
sumber
if ! git diff --quiet; then
lebih bersih dan lebih banyak performant (saya pikir). Dengan kata lain, gunakan kode keluar, bukan stdout.git diff --quiet
berperilaku berbeda darigit status --porcelain
untuk perubahan yang di-cache.Tidak cantik, tetapi bekerja:
Tidak yakin apakah pesan itu tergantung pada lokal, jadi mungkin letakkan
LANG=C
di depan.sumber