2017-03-02 7 views
1

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

+0

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

Antwort

0

Wie in "git diff during pre-commit hook results in Not a git repository", müssen Sie sicherstellen, dass GIT_DIR nicht gesetzt ist.

unset GIT_DIR 

(am Anfang des Skripts)

+0

Dies funktioniert nicht, noch wird in der verknüpften Antwort etwas vorgeschlagen. :( – MonkRocker

+0

@MonkRocker Was ist die Ausgabe von 'git rev-parse --show-toplevel', wenn das Skript als Hook ausgeführt wird (sowohl von der ausgefallenen als auch von der funktionierenden Workstation) Ist eine Umgebungsvariable auf einem gesetzt? Workstation und nicht auf der anderen? – VonC

+0

Auf der fehlgeschlagenen Workstation: Fatal: .git ist kein Repository. Auf der Arbeit - es gibt den richtigen Pfad. Ich habe keine GIT_ env vars überhaupt gesetzt. – MonkRocker