Fortsetzung https://stackoverflow.com/a/20574486/4935114 , @ Mike vorgeschlagen , eine schaffen pre-commit
Haken, wird grep
die inszenierte Dateien für die Leitungen in die man ignorieren könnte wollen. Der Hook prüft, ob diese Zeilen inszeniert wurden. Wenn ja, ist es eine echo
Warnung und es ist exit
mit Code, 1
so dass der Festschreibungsprozess nicht fortgesetzt wird.
Inspiriert von @ Mikes Antwort fand ich mich darin wieder, eine verbesserte Version seines Hakens zu verwenden, die automatisch reset
(mit der -p
Flagge) der spezifischen Zeile entspricht, die wir ignorieren möchten.
Ich bin nicht sicher, ob dieser Hook in einer Situation funktioniert, in der viele Dateien mit dieser Zeile ignoriert werden müssen, aber dieser pre-commit
Hook sucht nach einer Änderung in dieser Zeile in einer bestimmten Datei buildVars.java
. Das Hook-Skript sah so aus, als ich es auf meinem Computer testete.
#!/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
Erläuterung
Ich habe eine Kontrollsequenz wiederholt, die isPhoneGap
während eines interaktiven reset
Prozesses nach dem regulären Ausdruck sucht . Wenn Sie also einen Benutzer emulieren, der drückt, um /
zu suchen isPhoneGap
, drückt y
er, wenn er gefragt wird, ob er diesen Patch verwerfen möchte, und drückt schließlich q
, um das Interaktive zu beenden reset
.
Der interaktive umgekehrte Patch-Prozess ist hier dokumentiert: https://git-scm.com/docs/git-add#git-add-patch
HINWEIS: Das obige Skript setzt voraus, dass die Variable interactive.singleKey
ist false
. Wenn Sie Ihre konfiguriert haben true
, entfernen Sie alle direkt nach der Warnung $'\n'
aus dem echo
Befehl.