Git 预提交挂钩,用于在分阶段的 hunk 中搜索文本

问题描述 投票:0回答:1

我想防止提交带有特定字符串的文件,例如:

// TODO foo bar baz

所以我使用 git 预提交钩子:

#!/bin/sh

EXTENSIONS='\.(cs|cshtml|csproj|css|js|scss|sh|ts|xml|yml|md)?$'
FORBIDDEN='TODO'

git diff --cached --name-only | \
  sed -n -E "/$EXTENSIONS/p" | \
  GREP_COLORS='4;5;37;41' xargs grep --color --with-filename -n "$FORBIDDEN" \
  && echo 'ERROR: Found forbidden texts; remove them then retry' && exit 1 \
  || exit 0

这有效。但它有一个缺陷。

grep
在整个文件中搜索禁止文本,而不仅仅是上演的大块。因此,如果一个文件有我暂存的块,以及一个带有禁止文本的块(我没有暂存),那么它将取消提交。

是否可以仅在分阶段的帅哥中搜索模式,而不是整个文件?

(我希望脚本能够在破折号中运行。)

git sh githooks
1个回答
0
投票

我认为钩子可以很简单

#!/bin/sh
! git diff --cached -- "*.cs" "*.cshtml" "*.csproj" "*.css" "*.js" "*.scss" "*.sh" "*.ts" "*.xml" "*.yml" "*.md" |
    grep --quiet "TODO"

感叹号反转退出代码:1 表示找到,0 表示未找到。在

*
上加引号以防止 shell 扩展当前目录中的模式 — Git 在整个树中解释它们。

© www.soinside.com 2019 - 2024. All rights reserved.