Ada beberapa skrip yang tidak berfungsi dengan benar jika mereka memeriksa perubahan.
Saya mencobanya seperti ini:
VN=$(git describe --abbrev=7 HEAD 2>/dev/null)
git update-index -q --refresh
CHANGED=$(git diff-index --name-only HEAD --)
if [ ! -z $CHANGED ];
then VN="$VN-mod"
fi
Apakah ada semacam pemeriksaan boolean jika ada perubahan sejak komit terakhir, atau bagaimana saya bisa benar-benar menguji apakah ada perubahan baru pada repositori lokal saya?
Saya melakukan semua ini untuk skrip pembuatan versi (yang saya temukan di suatu tempat di sini).
git status
?Jawaban:
Apa yang Anda lakukan hampir akan berhasil: Anda harus mengutip
$CHANGED
jika itu kosong, dan-z
tes untuk kosong, yang berarti tidak ada perubahan. Yang Anda maksud adalah:Kutipan dari Git
GIT-VERSION-GEN
:Sepertinya Anda menyalinnya, tetapi Anda hanya lupa detail kutipan itu.
Tentu saja, Anda juga bisa melakukan ini:
Atau jika Anda hanya peduli dengan kasus "sesuatu telah berubah":
Menggunakan
--quiet
memiliki manfaat bahwa Git dapat berhenti memproses segera setelah bertemu dengan satu perbedaan, jadi mungkin tidak perlu memeriksa seluruh pohon kerja Anda.sumber
git diff --no-ext-diff --quiet --exit-code
untuk menentukan kondisi kotor.--no-ext-diff
pilihan adalah baik untuk keselamatan (dalam hal seseorang telah dikonfigurasi driver diff eksternal), meskipun--exit-code
seharusnya tidak perlu, karena itu tersirat oleh--quiet
.git diff-index
laporan berubah bahkan jika hanya waktu modifikasi file yang berubah (dan bukan isinya). Jika Andatouch
file, itu akan melaporkan modifikasi bahwa menjalankangit status
akan mengatur ulang. Menggunakangit status
seperti di bawah ini lebih baik.Menggunakan
git status
:sumber
git status --porcelain --untracked-files=no
]]; kemudianif [[ $(git status --porcelain | wc -l) -gt 0 ]]; then echo CHANGED else echo NOT CHANGED locally fi
git status --porcelain
melihat apakah output tidak kosong. Jika demikian itu berarti ada perubahan yang ada.Meskipun jawaban Jefromi bagus, saya memposting ini hanya untuk referensi.
Dari kode sumber Git ada
sh
skrip yang mencakup yang berikut ini.sumber
$1
adalah string yang menamai tugas yang ingin Anda jalankan dan$2
adalah string yang secara opsional berisi pesan kesalahan khusus pada kegagalan. Misalnya, sebut sepertirequire_clean_work_tree deploy "Skipping deploy, clean up your work tree or run dev-push"
Saya memiliki masalah yang sama, tetapi saya harus memeriksa file yang ditambahkan juga. Jadi saya melakukan yang berikut:
sumber
git status
adalah temanmuUbah ke direktori Git
git status
agar berfungsi:Tetapkan variabel untuk mengatur pohon kerja sehingga Anda tidak mendapatkan kesalahan 'Operasi ini harus dijalankan dalam pohon kerja':
Abadikan
git status
output dalam variabel BashGunakan
--porcelain
jaminan yang dalam format standar dan dapat diuraikan:Jika -n (bukan null), kami memiliki perubahan.
sumber
Ini juga berfungsi:
sumber
Ini bekerja dengan baik. Ini juga akan mencantumkan file yang terpengaruh:
sumber
git diff --no-ext-diff --quiet --exit-code
juga berfungsi.Berikut adalah serangkaian fungsi skrip Bash yang bagus yang memeriksa apakah ada perbedaan, mencetaknya kepada pengguna dan meminta pengguna jika mereka ingin melakukan perubahan sebelum penyebaran. Itu dibangun untuk aplikasi Heroku dan Python, tetapi perlu sedikit perubahan untuk aplikasi lain.
Anda dapat menyalin dari Gists di: https://gist.github.com/sshadmand/f33afe7c9071bb725105
sumber
Pertanyaan OP sudah lebih dari 9 tahun sekarang. Saya tidak tahu apa yang
man git-status
dikatakan saat itu, tetapi inilah yang dikatakan sekarang:Ini menunjukkan bahwa
--porcelain
argumen tersebut cocok untuk menguji status repo untuk perubahan.Ketahui pertanyaan OP, "Apakah ada semacam pemeriksaan boolean jika ada perubahan sejak komit terakhir, atau bagaimana saya bisa benar-benar menguji apakah ada perubahan baru pada repositori lokal saya?"
Saya tidak berpikir itu
bash
memiliki tipe data boolean per se , tetapi ini mungkin cukup dekat:Ini dapat dicetak ulang sebagai
if-then-else
formulir untuk skrip, atau dieksekusi apa adanya CLI saat berada di folder git repo . Jika tidak, gunakan-C
opsi dengan spec path ke repo yang menarik:Tambahan:
-u, --untracked-file
opsi untuk menghindari melaporkan status pada file yang ingin diabaikan. Catatan ini disertai dengan efek samping yang tidak menguntungkan : file yang baru ditambahkan juga tidak berstatus. Opsi ini berguna dalam beberapa situasi , tetapi pertimbangkan baik-baik sebelum menggunakannya.sumber
Begini cara saya melakukannya ...
sumber
rekatkan ini
Lari
sh checker_git.sh gitpath
sumber
Berdasarkan pada @ storm_m2138 komentar untuk jawaban @ RyanMoon ( tautan ) Saya menggunakan yang berikut ini di
Powershell
.sumber