[英]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.