能否提交预提交钩子?

3
我们为Python项目设置了预提交钩子。 pre-commit 位于未跟踪(有充分理由)的.git 文件夹中。

但是,对于新手来说,克隆存储库并忘记获取提交钩子非常常见。是否可以自动化此过程?例如,通过让git跟踪提交钩子来实现?或通过其他机制,例如当调用git clone时自动设置钩子。

例如,将 !.git/hooks/pre-commmit 添加到 .gitignore 中无法解决问题。


2
告诉人们使用脚本来进行克隆操作。让脚本将正确的钩子复制(或建立符号链接)到相应位置。 - undefined
那似乎是合乎逻辑的结论。 - undefined
4个回答

2
由于钩子可以运行任意代码,任何自动设置钩子的机制都会成为安全漏洞,因为它会让存储库的所有者在开发者的计算机上执行任意代码,所以你无法自动完成这个过程。
但是,你可以将它们检入存储库中的某个位置,然后设置一个标准脚本(例如GitHub使用的那种),该脚本安装钩子并准备存储库供使用。
我建议您阅读Git FAQ条目关于pre-commit钩子。它指出,它们存在的目的是帮助开发人员而不是作为有效的控制,因为它们可以很容易地被绕过而不被注意到。此外,许多使用频繁压缩和重置的工作流程的开发人员(我就是其中之一)发现pre-commit钩子是对他们标准工作流程的烦人障碍,因为会创建和销毁许多临时提交。因此,最好使用CI系统来验证测试和代码样式,并使钩子成为开发人员选择使用的选项。

2

看一下https://pre-commit.com/

您可以创建一个单独的存储库,并在您的项目中使用它来添加钩子。通过 YAML 文件进行配置和使用。


这可能是最简单的。但你仍然需要提供关于激活钩子的指示。或者使用 Husky:https://typicode.github.io/husky/#/ - undefined

2

不,这是不可能的。

(有趣的是这回答了你的问题,我建议将其重命名为“如何提交预提交挂钩”)

我不确定如何在没有构建系统的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
    }
}

在安卓系统上。

2

这是可能的,但不建议这样做。

当一个仓库被初始化时,它会从 git 模板 中复制 hooks。我们可以在模板中创建一个 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中有恶意代码怎么办?
正如其他答案所说,这不是一个好主意。请勿在生产环境中执行此操作。

“...从git模板中复制钩子。”所以首先需要分发模板目录,然后用户必须记住使用 git clone --templategit clone --hooks-path 进行克隆? - undefined
@phd 有一个默认模板路径。需要将钩子安装在该路径下。如果未指定模板,则会使用它。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接