我承諾import pdb;pdb.set_trace()
經常。檢查我的提交是否在emacs/git中有'import pdb'?
有沒有一種方便的方法來阻止我這麼做?
我使用emacs/git(magit)。
我承諾import pdb;pdb.set_trace()
經常。檢查我的提交是否在emacs/git中有'import pdb'?
有沒有一種方便的方法來阻止我這麼做?
我使用emacs/git(magit)。
爲了完整起見,這裏是如何審查的版本內容索引,建立關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的語法;和from pdb import ...
,或者更可能是import collections, pdb
,它不會捕獲它;但是現在它可以處理import
之後的多個空格,並避免錯誤的點擊,例如,import pdbase
)。has_import
變量,您可以稍後使用。 (如果你不打算使用任何東西以後可以消除變量,直接使用exit 1
那裏,他建議。)(這仍然至少有一個小小的瑕疵:提取的文件內容不如果你的塗抹和乾淨的過濾器添加和刪除import
行,我懷疑沒有任何預先提交鉤可以幫助你。:-))
這段代碼很脆弱:你在管道的右側運行「exit 1」,因此在子shell中運行。因此,這個「退出1」並不完全是整個shell,而只是子shell。如果在最後一行之後添加任何內容,那麼該行仍然會被執行(並且子shell的返回狀態可能會被忽略)。我想添加一個'|| 'done'關鍵字後退出1。 –
@MatthieuMoy:很好,修改了這個例子(如果用戶想要在檢測到導入的情況下繼續進行其他檢查,則稍有不同)。 – torek
fyi:實際發生的問題http://stackoverflow.com/questions/29969093/exit-1-in-pre-commit-doesnt-abort-git-commit/29972489#29972489 –
您可以創建的.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
我只是做起來。不知道它是否足夠用於一般用途,但適用於我。
感謝大衛
不完美(grep檢查文件的工作目錄版本,而'git diff - 緩存'更正確地看待分階段,即將被提交的版本),但只要你不讓分階段和待提交版本分歧,就會工作。 – torek
好如何做到這一點的例子。幾乎相同的用例,但與一個紅寶石應用程序。 http://stackoverflow.com/questions/20278573/git-pre-commit-hook –
相似的問題: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