Продовжуючи 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команди відразу після попередження.