Git挂钩拒绝文件包含特定字符串的提交

fir*_*dev 8 git

我用GuardRspec; 我用focus: true它来强制它只运行我正在进行的测试.但有时我会忘记删除focus: true,这会让我未来的自我和与之合作的人分心.

我想创建一个git钩子来检查spec文件夹,以确保focus: true除了测试文件之外没有,spec/rails_helper.rb并将其保存在Repository中.

我已经阅读了这个答案将git钩子放入存储库,猜测它必须有点尴尬.

如何使用钩子来阻止基于文件内容的提交?

更新

这是我现在拥有的,但它不起作用,即使没有匹配,git拒绝提交.

FILES_PATTERN='\.rb(\..+)?$'
FORBIDDEN="(\, focus: true|binding\.pry)"
git diff --cached --name-only | egrep "$FILES_PATTERN" | xargs egrep --with-filename -n "$FORBIDDEN" && echo "Commit reject, found $FORBIDDEN reference, please remove" && exit 1
exit 0
Run Code Online (Sandbox Code Playgroud)

Pau*_*cks 8

git-scm上有一本很好的信息来源.

你想要预提交钩子.要返回非零值(从而中止提交),您需要以下内容:

FILES_PATTERN='\.rb(\..+)?$'
FORBIDDEN='focus: true'
git diff --cached --name-only | \
  grep -spec/ | \
  grep -E $FILES_PATTERN | \
  xargs grep --with-filename -n $FORBIDDEN && echo "COMMIT REJECTED Found '$FORBIDDEN' references. Please remove them before commiting" && exit 1
Run Code Online (Sandbox Code Playgroud)

这是从这个相当不错的提示网站上取消的.我没有测试过我做的调整.

  • @JohnYeates这就是为什么人们应该在发布之前测试一下...我编辑了帖子来解决这些问题. (2认同)

Jor*_*ack 5

在现有答案的基础上,这是我正在使用的支持多个字符串的版本。

#!/bin/sh

declare -a arr=("This is the first string." "This is the second string.")

for i in "${arr[@]}"
do
    git diff --cached --name-only | xargs grep --with-filename -n $i && echo "COMMIT REJECTED! Found '$i' references. Please remove them before commiting." && exit 1
done

exit 0
Run Code Online (Sandbox Code Playgroud)