Ich habe ein eckiges Web-Projekt. Ich versuche ein Shell-Skript als Precommit-Hook für Git auszuführen. Hiergit Umwelt vs precommit Haken
ist das Skript selbst:
#!/bin/bash
echo "finding ESLint..."
ESLINT="$(git rev-parse --show-toplevel)/cf-itr-ui/node_modules/.bin/eslint"
# make sure eslint is installed:
if [[ ! -x "$ESLINT" ]]; then
echo -e "\t\033[41mESLint doesn't seem to be installed, or I can't find it :(\033[0m "
exit 1
fi
echo "ESLint found!"
for f in $(git diff --name-only | grep -E '\.(js|jsx)$')
do
echo "linting '$f'..."
git show ":$f" | "$ESLINT" --stdin --stdin-filename "$f"
if [ $? -ne 0 ]; then
echo "ESLint failed on staged file '$f'. Please check your code and try again. You can run ESLint manually via npm run eslint."
exit 1 # exit with failure status
fi
done
Wenn Sie dieses Skript von Hand in einem Terminal - alles wie erwartet funktioniert. Einfach genug, oder? Moment mal - es wird komisch.
Wenn es als Git Hook ausgeführt wird, wird das Skript ausgeführt, weil ich es suchen und finden eslint, aber die for-Schleife tut ..... nichts. Es veröffentlicht also nur das Commit - kein Linting.
Hatte ein anderer Entwickler den gesamten Repo klonen. Gleiches Ergebnis. Skript läuft gut von Hand, findet Dateien und listet sie auf. Als ein Haken laufen? Finde eslint, aber flackert nichts. Hatte ein 3. Entwickler es probiert - klonte das Repo in ein neues Verzeichnis, und seine Version funktioniert BEIDE wie ein Haken und von Hand.
Ich versuche, einen Unterschied in git env/config vars zwischen uns 3 zu finden, aber bisher kein Glück.
Wenn ich den Befehl git diff --name-only von irgendwo in der Projektnavigation aus führe - sehe ich Änderungen, also glaube ich nicht, dass es ein bloßes Pfadproblem ist.
Es ist also so, als hätte der Hook eine andere "Shell", in der er ausgeführt wird, sodass er nicht dasselbe Ergebnis von Befehlen erhält? Ich weiß es nicht. An diesem Punkt spüre ich einfach nur Spucke. Wer hat das jemals gesehen?
Bevor jemand fragt: Alle 3 Entwickler sind auf Macs. Einziger Unterschied, den ich bis jetzt gefunden habe:
Der Entwickler, von dem das funktioniert, ist auf git Version 2.8.1. Die beiden nicht-arbeitenden Entwickler sind am 2.10.2
Gab es einige Änderungen, wie Haken Griffe zwischen 2.8 und 2.10 sind?
TIA
Der wichtigste Trick Git Haken zu debuggen ist es, herauszufinden, wie sie zu beobachten. In diesem Fall läuft der Hook auf demselben Computer (im Gegensatz zu Pre-Receive-, Update- und Post-Receive-Hooks, die * nicht *). Auf dem gleichen Computer zu sein hilft sehr, da die meisten der üblichen Debug-Tricks direkt aus der Box funktionieren. Setzen Sie das Flag "-x" so, dass die Shell zum Beispiel jeden Befehl in stderr schreibt, wenn er ausgeführt wird. Versuchen Sie das Flag "-e", sodass jeder Befehl, der einen Exit-Status ungleich Null zurückgibt, das Skript sofort beendet. – torek