2013-07-09 14 views
8

Utworzono skrypt poprzedzający zatwierdzenie dla git, który działa poprawnie po uruchomieniu za pomocą wiersza polecenia. Oto, że scenariusz:Używanie poleceń git przed zatwierdzeniem w kontekście klienta GitHub

#!/bin/sh 
# 
# Pre-commit hooks 
echo "Running unit tests..." 

# Lint stuff before commiting 
grunt runtests 
RESULT=$? 

[ $RESULT -ne 0 ] && echo "Tests (or tasks) failed, aborting the commit" && exit 1 

echo "All tests passed, commiting your changes" && exit 0 

bym chciałby pre-commit również działa za pośrednictwem aplikacji klienckiej GitHub, ale nie mogę dostać, że praca. Skrypt przed popełnieniem jest wykonywany, ale generuje błąd. Oto pełny tekst, który zwraca w oknie alertu klienta:

Running unit tests... 
.git/hooks/pre-commit: line 7: grunt: command not found 
Tests (or tasks) failed, aborting the commit 
(1) 

Z jakiegoś powodu nie jest w stanie znaleźć pomruku. Ponownie zainstalowałem grunt cli i użyłem globalnej flagi "-g", ale to nie miało znaczenia. Jakieś pomysły, w jaki sposób mogę skłonić klienta do znalezienia pomruku?

Odpowiedz

20

Aplikacje GUI na OS X nie ładują plików w .bashrc/.bash_profile, co oznacza, że ​​nie będą miały określonych przez użytkownika dodatków $ PATH, takich jak /usr/local/bin, czyli tam, gdzie jest binarny pomruk. Możesz podać pełną ścieżkę lub poprawić $ PATH w haczyku przed zatwierdzeniem, dodając to po komentarzach górnych: PATH="/usr/local/bin:$PATH"

+0

To zadziałało, Sindre. Dzięki za pomoc! – ChrisCast

+0

Także dla mnie, dzięki! – renatoargh

+0

Miałem podobny problem podczas uruchamiania wstępnego zatwierdzenia z SourceTree. Terminal uruchomił "test testowy" z pre-commit, ale nie SourceTree. Dzięki..! zadziałało. –

-1

jako proste obejście określające pełną bezwzględną ścieżkę do pomruku powinno działać. Jeśli potrzebujesz więcej środowiska do skonfigurowania, musisz zbadać, w jaki sposób aplikacja github buduje środowisko dla haków.

1

Jeśli chcesz uruchomić skrypt, który dostanie twoje środowisko ($PATH, itp.) Powinieneś zmienić pierwszą linię skryptu z tego:

#!/bin/sh 

do:

#!/usr/bin/env sh 

Następnie zadzwonić grunt bez zakodowanego ścieżki.

W ten sposób, jeśli ścieżka do pliku wykonywalnego ulegnie zmianie w przyszłości lub będzie inna na innych komputerach, skrypt nadal będzie działał. /usr/bin/env otrzyma środowisko użytkownika, w którym skrypt jest uruchomiony. Jest to bardzo przydatne w miejscach, w których niektórzy używają różnych menedżerów pakietów, ale muszą uruchamiać te same skrypty. W przeciwnym razie można by znaleźć wiele logiki w poszukiwaniu aplikacji, których można było uniknąć, w zależności od prawidłowo wypełnionej wersji $PATH.

+1

nie działa dla mnie na komputerze Mac. –

+0

@ coding_idiot Możesz również spróbować zmienić 'sh' na' bash', aby zobaczyć, czy to podniesie twoją ścieżkę. Używałem tylko 'bash', ale wstawiłem tam' sh', ponieważ był to pierwotnie używany shell. –

6

Jeśli korzystasz z sourcetree (na Macu) i masz pre-commit i pre-push hooks, otwórz sourcetree z linii poleceń, zamiast otwierania go bezpośrednio, za pomocą następującego polecenia.

open /Applications/SourceTree.app/Contents/MacOS/SourceTree 

Teraz twoje haki będą działać, gdy spróbujesz popełnić i popchnąć. Jestem pewien, że działa również dla aplikacji Github.

+0

WOW. To jest pomieszane. Czy zgłosiłeś ten błąd do Atlassian? –

+0

https://answers.atlassian.com/questions/15698572/answers/41458849?flashId=1990845935 –

+2

W nowszej wersji drzewa źródłowego po prostu działa. Nie trzeba otwierać, korzystając z powyższego hackowania –

0

Sindre Sorhus' doskonała odpowiedź:

GUI aplikacje na OS X nie ładuje rzeczy w .bashrc/.bash_profile, co oznacza, że ​​nie będzie miał określonego użytkownika $ path dodatki jak /usr/local/bin , czyli tam, gdzie jest binarny pomruk.albo można podać pełną ścieżkę lub naprawić $ PATH w pre-commit, przez dodając ten po najlepszych opinii: PATH="/usr/local/bin:$PATH"

W moim przypadku to nie działa, ponieważ używam Node Version Manager, który przechowuje różne wersje węzła i ułatwia aktualizację i przełączanie wersji węzłów. Przechowuje moduły węzła dla każdej wersji węzła w osobnym pliku. Oto kod użyłem, aby ominąć ten problem:

#!/usr/bin/env bash 

PATH="/usr/local/bin:$PATH" 

if [ -f $HOME/.nvm/nvm.sh ] 
then 
    . $HOME/.nvm/nvm.sh 
    PATH="$HOME/.nvm/versions/node/$(nvm current)/bin:$PATH" 
fi 

ta sprawdza dla NVM, a jeśli istnieje, ładuje go i używa go, aby znaleźć drogę do modułów węzła dla obecnie stosowanego wersji węzła.

+0

Gdzie powinien znajdować się ten kod? Jak/kiedy jest uruchamiany? – sompylasar

Powiązane problemy