Melanjutkan https://stackoverflow.com/a/20574486/4935114 , @Mike mengusulkan untuk membuat pre-commitpengait yang akan ada grepdi file bertahap untuk baris yang mungkin ingin diabaikan. Pengait akan memeriksa apakah garis itu dipentaskan. Jika demikian, itu echoadalah peringatan dan itu exitdengan kode 1sehingga 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 -pbendera) 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-commithook 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 isPhoneGapselama resetproses interaktif . Jadi meniru pengguna yang menekan /untuk mencari isPhoneGap, menekan yketika ditanya apakah dia ingin membuang tambalan ini dan akhirnya menekan quntuk 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.singleKeyadalah false. Jika Anda mengkonfigurasi milik Anda ke true, hapus salah satu $'\n'dari echoperintah tepat setelah peringatan.