仅当某些目录中的文件被修改时才执行 git pre-commit 钩子

Dac*_*663 14 bash git

我正在尝试为 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 后面的任何代码仍将被执行!


Mat*_*lin 7

您可以使用内置的 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)