2013-11-29 185 views
1

我是git hooks的新手。我無法理解下面的提交前鉤子。誰能告訴我這是如何工作Please.Here我的懷疑是如何在提交的文件中發生grep,因爲我們沒有把這些文件放在任何地方。很抱歉,如果我問錯了問題,但請幫我理解git的鉤..Git pre-commit hook

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

這是一個有趣的消息,但爲什麼不把它寫在shell?我在shell中使用grep似乎更自然。 – squiguy

+0

我是紅寶石背景我對shell腳本不靈活。有沒有辦法學習git鉤子的基礎知識?如果有,請幫助我。 – user2986573

+0

git鉤子可以用任何語言編寫,退出代碼是重要的。如果您願意使用Ruby搜索文件以查找文本,請繼續。你可以通過man githook來閱讀手冊中的信息。這是一個很好的資源。該代碼是非常簡單的Ruby。它讀取「除非系統調用grep結果爲空,打印一條消息並退出並退出代碼1」。 – vgoff

回答

4

你還是用grep,而不是你的工作樹索引(緩存)文件。
否則,您的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)