Kontynuując https://stackoverflow.com/a/20574486/4935114 , @Mike zaproponował utworzenie pre-commit
haka, który będzie grep
w plikach pomostowych dla linii, które można zignorować. Haczyk sprawdza, czy te linie zostały ustawione. Jeśli tak, jest to echo
ostrzeżenie i exit
zawiera kod, 1
więc proces zatwierdzania nie będzie kontynuowany.
Zainspirowany odpowiedzią @ Mike'a , znalazłem być może używam ulepszonej wersji jego haka, który automatycznie reset
(z -p
flagą) łączy się z określoną linią, którą chcemy zignorować.
Nie jestem pewien, czy ten punkt zaczepienia zadziała w sytuacji, gdy masz wiele plików z tą linią do zignorowania, ale ten pre-commit
punkt zaczepienia szuka zmiany w tym wierszu w określonym pliku buildVars.java
. Skrypt przechwytujący wyglądał tak, kiedy testowałem go na moim komputerze.
#!/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
Wyjaśnienie
To, co zrobiłem, to powtórzenie sekwencji kontrolnych, które wyszukują wyrażenie regularne isPhoneGap
podczas reset
procesu interaktywnego . W ten sposób emulując użytkownika, który naciska, /
aby wyszukać isPhoneGap
, naciska, y
gdy pyta, czy chce odrzucić tę poprawkę, a na koniec naciska, q
aby wyjść z aplikacji interaktywnej reset
.
Interaktywny proces odwróconej łatki jest udokumentowany tutaj: https://git-scm.com/docs/git-add#git-add-patch
UWAGA: Powyższy skrypt przy założeniu, że zmienną interactive.singleKey
jest false
. Jeśli skonfigurowałeś swoje true
, usuń je $'\n'
z echo
polecenia zaraz po ostrzeżeniu.