Продовжуючи https://stackoverflow.com/a/20574486/4935114 , @Mike запропонував створити pre-commit
гачок, який буде grep
у поступових файлах для рядків, які можна захотіти ігнорувати. Гачок перевіряє, чи були виконані ці лінії. Якщо це так, воно echo
попереджає і це exit
з кодом, 1
тому процес фіксації не триватиме.
Натхненний відповіддю @ Майка , я опинився, використовуючи, можливо, вдосконалену версію його гака, яка автоматично reset
(з -p
прапором) визначає конкретний рядок, який ми хочемо ігнорувати.
Я не впевнений, що цей гак буде працювати в ситуації, коли у вас є безліч файлів із цією лінією, яку слід ігнорувати, але цей pre-commit
гачок шукає зміну цього рядка в конкретному файлі buildVars.java
. Сценарій гачка виглядав так, коли я тестував його на своїй машині.
#!/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
Пояснення
Що я зробив - це повторення контрольних послідовностей, які шукають регулярний вираз isPhoneGap
під час інтерактивного reset
процесу. Таким чином, емуляція користувача, який натискає /
на пошук isPhoneGap
, натискає, y
коли його запитують, чи хоче він відкинути цей патч, і, нарешті, натискає, q
щоб вийти з інтерактивного reset
.
Процес інтерактивного зворотного виправлення задокументований тут: https://git-scm.com/docs/git-add#git-add-patch
ПРИМІТКА. Наведений вище сценарій, припускаючи, що змінна interactive.singleKey
є false
. Якщо ви налаштували своє true
, видаліть будь-яку $'\n'
з echo
команди відразу після попередження.