[英]Is it possible to commit the pre-commit hooks?
我們為我們的 Python 項目設置了預提交掛鈎。 pre-commit
位於未跟蹤的.git
文件夾中(有充分的理由)。
但是對於一個新人來說,克隆一個 repo 並忘記啟動提交鈎子是很常見的。 有可能自動化嗎? 例如,通過 git 跟蹤提交掛鈎? 或者通過其他一些機制,例如當git clone
時,鈎子會自動設置。
例如,將..git/hooks/pre-commmit
到.gitignore
並不能解決問題。
不,這是不可能的。
(有趣的是,這回答了你的問題,我建議將其重命名為“如何提交預提交掛鈎”)
我不確定如何在沒有構建系統的 python 項目中執行此操作。 您可以在自述文件中添加一些行。
我們在 dotnet 和 android 項目中所做的事情:我們在我們的項目中添加了一個可以設置掛鈎的階段。 開發人員很有可能在提交之前至少構建一次項目。
我們有目錄/git_hooks
和從中復制文件的腳本:
<Target Name="PostBuild" AfterTargets="PostBuildEvent">
<Message Text="Install Git Hooks" Importance="high" />
<Copy SourceFiles="$(SolutionDir)/git_hooks/pre-commit"
DestinationFolder="$(SolutionDir)/.git/hooks"
ContinueOnError="true"
SkipUnchangedFiles="true" />
</Target>
或者
buildscript {
//.....
copy {
from "./git_hooks"
into "./.git/hooks"
fileMode 0777
}
}
在 Android 上。
您不能自動執行此操作,因為掛鈎可以運行任意代碼,並且任何自動設置掛鈎的機制都將是一個安全漏洞,因為它會讓存儲庫的所有者在開發人員機器上執行任意代碼。
但是,您可能希望將它們簽入存儲庫中的某個位置,然后設置一個標准腳本(例如GitHub 使用的那種),它安裝掛鈎並准備存儲庫以供使用。
但是,我鼓勵您閱讀Git 常見問題解答條目關於pre-commit
掛鈎。 它指出它們是用來幫助開發人員的,而不是作為一種有效的控制,因為它們很容易被繞過而無需通知。 此外,許多使用頻繁壓縮和變基的工作流的開發人員(我就是其中之一)發現pre-commit
鈎子是他們標准工作流的一個令人討厭的障礙,因為許多臨時提交被創建和銷毀。 因此,您最好使用 CI 系統來驗證測試和代碼樣式等內容,並讓開發人員可以選擇使用鈎子(如果他們想使用它們)。
這是可能的,但不推薦。
初始化存儲庫時,它會從git 模板復制掛鈎。 我們可以在模板中創建一個post-checkout
。 這是一個示例:
#!/bin/bash
gitworktree=$(git rev-parse --show-toplevel)
if [[ -f ${gitworktree}/pre-commit ]];then
echo deploy pre-commit
cp -v ${gitworktree}/pre-commit ${gitworktree}/.git/hooks/pre-commit
chmod a+x ${gitworktree}/.git/hooks/pre-commit
fi
在沒有-n
的git clone
之后, post-checkout
會自動復制到新存儲庫的.git/hooks
中。 然后簽出代碼並調用post-checkout
。 如果新存儲庫中存在pre-commit
,則將其復制到.git/hooks
。 這只是一個草案計划。 在實際案例中可能存在一些問題。 例如,我們如何處理模板中已經存在的pre-commit
? 是否有必要檢查pre-commit
是否是已提交的? 如果pre-commit
中有惡意代碼怎么辦?
正如其他答案所說,這不是一個好主意。 不要在生產環境中這樣做。
您可以使用您的鈎子創建一個單獨的存儲庫並在您的項目中使用它。 使用是通過 YAML 文件配置的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.