我想防止提交带有特定字符串的文件,例如:
// 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
在整个文件中搜索禁止文本,而不仅仅是上演的大块。因此,如果一个文件有我暂存的块,以及一个带有禁止文本的块(我没有暂存),那么它将取消提交。
是否可以仅在分阶段的帅哥中搜索模式,而不是整个文件?
(我希望脚本能够在破折号中运行。)
我认为钩子可以很简单
#!/bin/sh
! git diff --cached -- "*.cs" "*.cshtml" "*.csproj" "*.css" "*.js" "*.scss" "*.sh" "*.ts" "*.xml" "*.yml" "*.md" |
grep --quiet "TODO"
感叹号反转退出代码:1 表示找到,0 表示未找到。在
*
上加引号以防止 shell 扩展当前目录中的模式 — Git 在整个树中解释它们。