我正在尝试为 git pre-commit 钩子创建一个 bash 脚本。每当进行提交时,我想检查某个目录中的文件是否是暂存文件的一部分,如果是,则运行命令(Grunt 任务)。到目前为止,我一切正常,除了只有在修改某些文件时才运行。我正在努力让它发挥作用:
SRC_PATTERN="site/assets/js/"
if [ grep --quiet $SRC_PATTERN `git diff --cached --name-only` ]
then
echo "none"
exit 0
fi
Run Code Online (Sandbox Code Playgroud)
不幸的是,这给了我错误。
小智 11
尝试,
git diff --cached --name-only | if grep --quiet "$SRC_PATTERN"
then
...
Run Code Online (Sandbox Code Playgroud)
快乐黑客
小智 9
像这样尝试:
SRC_PATTERN="site/assets/js/"
if git diff --cached --name-only | grep --quiet "$SRC_PATTERN"
then
echo "none"
exit 0
fi
Run Code Online (Sandbox Code Playgroud)
这看起来很像公认的答案,但那个答案是错误的。在 bash/sh 中,管道中的每个命令都在单独的子外壳中执行,因此 then 部分中的退出只会退出子外壳, fi 后面的任何代码仍将被执行!
您可以使用内置的 git git diff --cached --quiet -- "$SRC_PATTERN"。
--quiet意味着--exit-code,如果代码未更改,则 git 会退出并显示代码0。
$SRC_PATTEN可以包含 * 来匹配任何内容(包括/)。例如*/tests/*.py会匹配backend/tests/src/main.py.
例子:
if git diff --cached --quiet -- "backend/*.py"; then
echo "Unchanged"
else
echo "Changed"
fi
Run Code Online (Sandbox Code Playgroud)