仅当特定目录中的文件被修改时才执行 git pre-commit hook

仅当特定目录中的文件被修改时才执行 git pre-commit hook

我正在尝试为 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

不幸的是,这给我带来了错误。

答案1

尝试,

git diff --cached --name-only | if grep --quiet "$SRC_PATTERN"
then
    ...

快乐黑客

答案2

尝试一下:

SRC_PATTERN="site/assets/js/"
if git diff --cached --name-only | grep --quiet "$SRC_PATTERN"
then
  echo "none"
  exit 0
fi

这看起来很像可接受的答案,但那是错误的。在 bash/sh 中,管道中的每个命令都在单独的子 shell 中执行,因此 then 部分中的 exit 只会退出子 shell,fi 之后的任何代码仍将被执行!

答案3

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

相关内容