![仅当特定目录中的文件被修改时才执行 git pre-commit hook](https://linux22.com/image/1351498/%E4%BB%85%E5%BD%93%E7%89%B9%E5%AE%9A%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6%E8%A2%AB%E4%BF%AE%E6%94%B9%E6%97%B6%E6%89%8D%E6%89%A7%E8%A1%8C%20git%20pre-commit%20hook.png)
我正在尝试为 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