2014-01-23 32 views
3

我承諾import pdb;pdb.set_trace()經常。檢查我的提交是否在emacs/git中有'import pdb'?

有沒有一種方便的方法來阻止我這麼做?

我使用emacs/git(magit)。

+2

好如何做到這一點的例子。幾乎相同的用例,但與一個紅寶石應用程序。 http://stackoverflow.com/questions/20278573/git-pre-commit-hook –

+0

相似的問題:http://stackoverflow.com/questions/11560336/magit-how-to-see-pre-commit-hooks-before -editing-commit-log和在Magit中實現鉤子:https://github.com/vanicat/magit/commit/87ec17c46b156c8508a47aa6c9ba982ef8a61b4c – Ehvince

回答

3

爲了完整起見,這裏是如何審查的版本內容索引,建立關eugene's answer並與一些更多的變化(未測試作爲一個完整的掛鉤,而應工作):

#!/bin/sh 

has_import=false 
git diff --cached --no-renames --name-status --diff-filter=AM | 
    while read st file; do 
    case "$file" in 
    *.py) 
     if git show ":$file" | 
      grep -E "^[^#]*\bimport[[:space:]]+pdb\b"; then 
      echo "$file: has import pdb" 
      exit 1 
     fi;; 
    esac 
done || has_import=true 

if $has_import; then 
    exit 1 
fi 

最重要的變化是git show ":$file"技巧,它使用git show從索引中提取暫存版本。

我也:

  • 添加--no-renames使重命名的文件顯示爲A dded(處理R更難,還不如干脆把它們當作新);
  • 刪除了C,因爲如果它被觸發(因爲「other」文件名也被打印,就像R enames,但我認爲它在這裏不會觸發);
  • 使用case刪除了一些特定於bash的語法;和
  • 有點加強grep的表達(它仍然不完美,你可以做from pdb import ...,或者更可能是import collections, pdb,它不會捕獲它;但是現在它可以處理import之後的多個空格,並避免錯誤的點擊,例如,import pdbase)。
  • Matthieu Moy's comment,加強了shell片段以設置一個has_import變量,您可以稍後使用。 (如果你不打算使用任何東西以後可以消除變量,直接使用exit 1那裏,他建議。)

(這仍然至少有一個小小的瑕疵:提取的文件內容不如果你的塗抹和乾淨的過濾器添加和刪除import行,我懷疑沒有任何預先提交鉤可以幫助你。:-))

+0

這段代碼很脆弱:你在管道的右側運行「exit 1」,因此在子shell中運行。因此,這個「退出1」並不完全是整個shell,而只是子shell。如果在最後一行之後添加任何內容,那麼該行仍然會被執行(並且子shell的返回狀態可能會被忽略)。我想添加一個'|| 'done'關鍵字後退出1。 –

+0

@MatthieuMoy:很好,修改了這個例子(如果用戶想要在檢測到導入的情況下繼續進行其他檢查,則稍有不同)。 – torek

+0

fyi:實際發生的問題http://stackoverflow.com/questions/29969093/exit-1-in-pre-commit-doesnt-abort-git-commit/29972489#29972489 –

0

您可以創建的.git /掛鉤/預提交

#!/bin/bash 

git diff --cached --name-status --diff-filter=ACM | while read st file; do 
    if [[ "$file" =~ .py$ ]] && grep "^[^#]*import pdb" "$file"; then 
     echo "$file: has import pdb" 
     exit 1 
    fi 
done 

我只是做起來。不知道它是否足夠用於一般用途,但適用於我。

感謝大衛

+0

不完美(grep檢查文件的工作目錄版本,而'git diff - 緩存'更正確地看待分階段,即將被提交的版本),但只要你不讓分階段和待提交版本分歧,就會工作。 – torek

相關問題