Poursuivant https://stackoverflow.com/a/20574486/4935114 , @Mike a proposé de créer un pre-commit
hook qui se trouvera grep
dans les fichiers intermédiaires pour les lignes que l'on pourrait vouloir ignorer. Le hook vérifie si ces lignes ont été mises en scène. Si c'est le cas, c'est echo
un avertissement et c'est exit
avec du code 1
donc le processus de validation ne se poursuit pas.
Inspiré par la réponse de @ Mike , je me suis retrouvé à utiliser peut-être une version améliorée de son hook qui s automatiquement reset
(avec le -p
drapeau) la ligne spécifique que nous voulons ignorer.
Je ne suis pas sûr que ce hook fonctionnera dans une situation où vous avez de nombreux fichiers avec cette ligne à ignorer, mais ce pre-commit
hook recherche un changement dans cette ligne dans un fichier spécifique buildVars.java
. Le script de hook ressemblait à ceci lorsque je l'ai testé sur ma machine.
#!/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
Explication
Ce que j'ai fait, c'est faire écho à des séquences de contrôle qui recherchent l'expression régulière isPhoneGap
pendant un reset
processus interactif . Émulant ainsi un utilisateur qui appuie sur /
pour rechercher isPhoneGap
, appuie y
lorsqu'on lui demande s'il veut supprimer ce patch et enfin appuie sur q
pour quitter l'interactif reset
.
Le processus de patch inversé interactif est documenté ici: https://git-scm.com/docs/git-add#git-add-patch
REMARQUE: le script ci-dessus en supposant que la variable interactive.singleKey
est false
. Si vous avez configuré le vôtre sur true
, supprimez-en un $'\n'
de la echo
commande juste après l'avertissement.