2017-03-02 125 views
1

我有一個角度的web項目。我正在嘗試運行一個shell腳本作爲git的precommit鉤子。git環境vs precommit鉤

這裏是腳本本身:

#!/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 

跑手這個腳本在終端 - 一切正常。很簡單,對嗎?等一下 - 它會變得很奇怪。

當作爲git鉤子執行時,腳本運行,因爲我看到它在尋找並找到eslint,但for循環確實沒有任何東西。所以它只是發佈提交 - 根本不會。

有另一個開發人員克隆整個回購。同樣的結果。腳本可以手動運行,找到文件並將它們擦掉。作爲鉤子運行?找到eslint,但絲毫沒有。有第三個開發者嘗試它 - 將repo克隆到一個新的目錄中,並且他的版本可以很好地作爲鉤子和手工工作。

我想在我們之間的git env/config vars中找到一些區別,但到目前爲止沒有運氣。

如果我從項目樹中的任何位置運行git diff --name-only命令 - 我看到更改,所以我不認爲這是一個單純的路徑問題。

所以它就像鉤子有一個不同的「shell」它執行,所以它沒有得到相同的命令結果?我不知道。在這一點上,我很好地成了sp ball。任何人都見過這個?

之前有人問:所有3個開發者都在Mac上。唯一的區別我發現迄今爲止:

這個工作的開發者在git 2.8.1版上。 這兩個非工作的開發者是在2.10.2

是否有一些改變如何鉤子是2.8和2.10之間的句柄?

TIA

+0

主要的竅門調試Git的掛鉤是搞清楚如何觀察他們。在這種情況下,鉤子在同一臺計算機上運行(vs預接收,更新和後接收鉤子,*不*)。在同一臺計算機上工作起來非常有幫助,因爲大部分通常的調試技巧都可以直接使用。例如,設置'-x'標誌,以便shell在執行stderr時將每個命令寫入標準錯誤。嘗試使用'-e'標誌,以便任何返回非零退出狀態的命令都會立即退出腳本。 – torek

回答

0

正如在 「git diff during pre-commit hook results in Not a git repository」,你需要確保GIT_DIR未設置。

unset GIT_DIR 

(在腳本的開頭)

+0

這不起作用,鏈接答案中也沒有任何建議。 :( – MonkRocker

+0

@MonkRocker當腳本作爲鉤子運行時,git rev-parse --show-toplevel的輸出是什麼?(從失敗的工作站和工作正常的工作站都可以看到)。是否有任何環境變量設置爲一個工作站,而不是另一個? – VonC

+0

在失敗的工作站上:致命:.git不是存儲庫,在工作中 - 它返回正確的路徑,我沒有設置GIT_ env vars – MonkRocker