Continuando https://stackoverflow.com/a/20574486/4935114 , @Mike propôs a criação de um pre-commit
gancho que irá grep
nos arquivos de teste para as linhas que alguém pode querer ignorar. O gancho verifica se essas linhas foram encenadas. Em caso afirmativo, é echo
um aviso e exit
está com código 1
para que o processo de confirmação não continue.
Inspirado pela resposta de @Mike , acabei usando talvez uma versão melhorada de seu gancho que mostra automaticamente reset
(com a -p
bandeira) a linha específica que queremos ignorar.
Não tenho certeza se este gancho funcionará para uma situação onde você tem muitos arquivos com esta linha para serem ignorados, mas este pre-commit
gancho procura uma alteração nesta linha em um arquivo específico buildVars.java
. O script de gancho se parecia com isso quando testei em minha máquina.
#!/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
Explicação
O que fiz foi ecoar uma sequência de controle que procura o regex isPhoneGap
durante um reset
processo interativo . Emulando assim um usuário que pressiona /
para pesquisar isPhoneGap
, pressiona y
quando questionado se deseja descartar esse patch e finalmente pressiona q
para sair do interativo reset
.
O processo de patch reverso interativo está documentado aqui: https://git-scm.com/docs/git-add#git-add-patch
NOTA: O script acima presume que a variável interactive.singleKey
é false
. Se você configurou o seu para true
, remova qualquer um $'\n'
do echo
comando logo após o aviso.