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