Git pre-commit hook

时间:2013-11-29 04:51:20

标签: ruby githooks

我是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

1 个答案:

答案 0 :(得分:4)

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

请参阅“Git pre-commit hook : changed/added files”:

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

如“Why You Need a Git Pre-Commit Hook and Why Most Are Wrong”中所述:

  

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

approach if that 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)