Quero evitar o commit de arquivos com uma determinada string, por exemplo:
// TODO foo bar baz
Então eu uso um hook de pré-commit do git :
#!/bin/sh
EXTENSIONS='\.(cs|cshtml|csproj|css|js|scss|sh|ts|xml|yml|md)?$'
FORBIDDEN='TODO'
git diff --cached --name-only | \
sed -n -E "/$EXTENSIONS/p" | \
GREP_COLORS='4;5;37;41' xargs grep --color --with-filename -n "$FORBIDDEN" \
&& echo 'ERROR: Found forbidden texts; remove them then retry' && exit 1 \
|| exit 0
Isso funciona. Mas tem uma falha.
As grep
buscas pelo texto proibido no arquivo inteiro, em vez de apenas os pedaços preparados. Então, se um arquivo tem pedaços que eu preparo, e um pedaço com o texto proibido (que eu não preparo), então ele cancelará o commit.
É possível procurar o padrão apenas nos pedaços preparados, em vez de no arquivo inteiro?
(Gostaria que o script funcionasse no dash.)
Acho que o gancho poderia ser tão simples quanto
Sinal de exclamação para inverter o código de saída: 1 para encontrado, 0 para não encontrado. Aspas
*
para evitar que o shell expanda padrões no diretório atual e passe os padrões para o Git — o Git os interpreta na árvore inteira.