Melanjutkan https://stackoverflow.com/a/20574486/4935114 , @Mike mengusulkan untuk membuat pre-commit
pengait yang akan ada grep
di file bertahap untuk baris yang mungkin ingin diabaikan. Pengait akan memeriksa apakah garis itu dipentaskan. Jika demikian, itu echo
adalah peringatan dan itu exit
dengan kode 1
sehingga proses komit tidak akan dilanjutkan.
Terinspirasi oleh jawaban @ Mike , saya menemukan diri saya mungkin menggunakan versi yang lebih baik dari hooknya yang secara otomatis reset
s (dengan -p
bendera) baris spesifik yang ingin kita abaikan.
Saya tidak yakin hook ini akan bekerja untuk situasi di mana Anda memiliki banyak file dengan baris ini untuk diabaikan, tetapi pre-commit
hook ini mencari perubahan pada baris ini di file tertentu buildVars.java
. Skrip hook terlihat seperti ini ketika saya mengujinya di mesin saya.
#!/bin/sh
# this hook looks for lines with the text `var isPhoneGap = false;` in the file `buildVars.java` and it resets these lines to the previous state before staged with `reset -p`
if [[ $(git diff --no-ext-diff --cached buildVars.java | grep --count -e "var\ isPhoneGap[\ ]*=[\ ]*") -ne 0 ]]; then
cat <<EOW
WARNING: You are attempting to commit changes which are not supposed to be commited according to this \`pre-commit\` hook
This \`pre-commit\` hook will reset all the files containing this line to it's previous state in the last commit.
EOW
echo /$'\n'isPhoneGap$'\n'y$'\n'q | git reset -p
# BONUS: Check if after reseting, there is no actual changes to be commited and if so, exit 1 so the commit process will abort.
if [[ $(git diff --no-ext-diff --cached | wc -l) -eq 0 ]]; then
echo there are no actual changes to be commited and besides the change to the variable \'isPhoneGap\' so I won\'t commit.
exit 1
fi
fi
Penjelasan
Apa yang saya lakukan adalah menggemakan urutan kontrol yang mencari regex isPhoneGap
selama reset
proses interaktif . Jadi meniru pengguna yang menekan /
untuk mencari isPhoneGap
, menekan y
ketika ditanya apakah dia ingin membuang tambalan ini dan akhirnya menekan q
untuk keluar dari interaktif reset
.
Proses tambalan terbalik interaktif didokumentasikan di sini: https://git-scm.com/docs/git-add#git-add-patch
CATATAN: Skrip di atas mengasumsikan bahwa variabel interactive.singleKey
adalah false
. Jika Anda mengkonfigurasi milik Anda ke true
, hapus salah satu $'\n'
dari echo
perintah tepat setelah peringatan.