Продолжая https://stackoverflow.com/a/20574486/4935114 , @Mike предложил создать pre-commit
перехватчик, который будет grep
в поэтапных файлах для строк, которые можно игнорировать. Хук проверяет, были ли эти строки поставлены. Если да, то это echo
предупреждение, и это exit
связано с кодом, 1
поэтому процесс фиксации не будет продолжен.
Вдохновленный ответом @Mike , я обнаружил, что использую, возможно, улучшенную версию его крючка, который автоматически 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
команды сразу после предупреждения.