Fortsetzung https://stackoverflow.com/a/20574486/4935114 , @ Mike vorgeschlagen , eine schaffen pre-commitHaken, wird grepdie 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 echoWarnung und es ist exitmit Code, 1so 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 -pFlagge) 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-commitHook 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 isPhoneGapwährend eines interaktiven resetProzesses nach dem regulären Ausdruck sucht . Wenn Sie also einen Benutzer emulieren, der drückt, um /zu suchen isPhoneGap, drückt yer, 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.singleKeyist false. Wenn Sie Ihre konfiguriert haben true, entfernen Sie alle direkt nach der Warnung $'\n'aus dem echoBefehl.