Git pre-commit hook

我是git hooks的新手。 我无法理解下面的预提交钩子。 任何人都可以告诉我这是如何工作的。我怀疑是如何在提交的文件中发生grep,因为我们没有把这些文件带到任何地方。 对不起,如果我提出错误的问题,但请帮助我理解git hooks ..

#!/usr/bin/env ruby if `grep -rls "require 'ruby-debug'; raise" *` != "" puts "You twit, you've left a debugger in!" exit(1) end 

您应该更喜欢grep索引(缓存)文件,而不是工作树。
否则,您的grep可以在文件(或文件的一部分)中找到不属于下一次提交的调试指令。

请参阅“ Git预提交挂钩:已更改/添加的文件 ”:

 git diff --cached --name-only --diff-filter=ACM 

正如“ 为什么你需要一个Git Pre-Commit Hook以及为什么大多数都错了 ”中所解释的:

大多数测试针对当前磁盘上的任何文件,而不是暂存区域中的文件(实际提交的文件)。

如果该钩子有点不同的方法:它会在搜索文件之前保存正在进行的每项工作。

 def main(all_files): # Stash any changes to the working tree that are not going to be committed subprocess.call(['git', 'stash', '-u', '--keep-index'], stdout=subprocess.PIPE)