我在一个有数千名开发人员的企业环境中工作,我们实现了一些服务器端挂钩以防止大文件被推送,以及具有某些扩展名和mime类型的文件。
问题是,我们的应用程序在试图处理我们的用户活动级别时,本质上爆炸了,所以我认为使用客户端钩子是将这个处理卸载给用户的最佳方法.然而,这意味着:
1.-为了执行规则,我们不能依靠用户下载和安装每个存储库的钩子。
2.-我们需要把这些钩保持在中央位置的最新位置
3.-所有这一切都应在用户尝试推送之后,但在更改未打包之前发生。
将其绑定到构建脚本或修改存储库将是绝对不可能的,因为我不想污染用户的存储库,而且理想情况下,这对用户来说应该是完全透明的,这样用户甚至不知道这些规则的处理是在他们一方完成的,并且是防篡改的(即,作为一个用户,我会转到本地的钩子目录并修改脚本)。
你知道这是否可以通过服务器在预接收或类似钩子中启动的一些模糊的Git机制来完成?或者,即使方法完全不同,也可能有更好的解决方案吗?
我厌倦了向用户解释Git不是用来存储二进制文件的,特别是发布二进制文件(我们的许多用户都是在SVN,P4中进行这种可怕的实践).它影响到我们的Git服务器,并开始膨胀他们的构建时间..。然后他们就怪罪于它。
你猜到了,我在里面工作,是的.我们已经试着关掉服务器了。
发布于 2020-03-09 04:57:15
简短答覆:
不是的。没有内置的git功能可以让您从服务器上无形地安装客户端钩子。
较长的答覆:
是。虽然没有内置方式来隐式安装客户端钩子(也不应该安装),但如果您能够控制您的团队正在使用的机器(例如,维护组策略或代表用户运行管理命令的能力),那么就有办法实现您所追求的目标。
完全披露:我在亚特兰西安的主要支持团队工作,并且非常接近于我们的Bitbucket Server开发人员。话虽如此,但这几乎完全是一个git问题,而不是Bitbucket问题,所以我将在这里集中讨论。
选项1:覆盖core.hooksPath
(另见:https://git-scm.com/docs/githooks)
默认情况下,git在$GIT_DIR/hooks/*
中查找存储库中的钩子。这是可配置的,无论是在每个回购级别和在全球层面。在全球范围内配置这个非常简单:
git config --global core.hooksPath /path/to/custom/hooks
这将或多或少地对所有新的和现有的存储库产生直接影响。您需要一些方法在每个团队成员的工作站上运行这一点,但是大多数企业环境已经有了远程运行脚本等的方法,因此这实际上只是一个让您的IT管理团队相信这是一个必要的业务需求的问题。
当然,要真正使用自定义钩子,要么需要确保您使用的路径是普遍可访问的(一个自动安装的位置),要么--也许更安全--将钩子本地复制到它们的机器上。同样,我期待您有机制来执行此操作,或者可以远程运行脚本以达到同样的效果。
如果要在本地计算机上尝试core.hooksPath
设置,请执行以下操作:
$ mkdir ~/.globalgithooks
$ echo "printf 'hello world\n'" > ~/.globalgithooks/pre-commit
$ chmod +x ~/.globalgithooks/pre-commit
$ git config --global core.hooksPath ~/.globalgithooks
然后找到一些repos (新的或现有的),您可以安全地提交一些虚拟提交,这样就会看到它起作用了。
Pros:
都生效。
Cons:
。
选项2:重写git模板dir
(另见:https://git-scm.com/docs/git-init#_template_directory)
在创建存储库时,git不只是从“nothing”中设置它;它使用了一个预先打包的模板目录,其中包含(引用上述链接)‘某些目录结构、建议的“排除模式”和示例钩子文件。您可以将自己的自定义钩子添加到这个模板目录中,并且每当创建新的存储库时,它们都将被复制到存储库的本地钩子集($GIT_DIR/hooks
)中。有趣的事实:即使您克隆了一个存储库,您仍然在创建一个“新的”存储库--它只是一个新的存储库,git然后添加一个上游的远程URL,获取对象并检查默认的分支。换句话说,在克隆时仍然会使用模板目录,因此在那里创建的自定义钩子将自动为通过克隆创建的任何存储库设置。
同样,您需要对机器进行某种托管访问才能做到这一点。但是,它可以说比第一个选项更复杂;在选项1中,您可以在任何地方复制钩子并运行一个简单的git config
命令,为了使该选项工作,您需要为该用户的git安装找到正确的模板目录。考虑到git可能以多种方式安装在不同的操作系统和不同的包管理器上,这意味着您需要确定目录的位置。默认情况下,在Linux中,这是/usr/share/git-core/templates
;在我的macOS上的自制安装上,可以在/usr/local/Cellar/git/$GIT_VERSION/share/git-core/templates
上找到它,并在/usr/local/share/git-core/templates
…上提供一个符号链接。换句话说,您需要拼凑出某种逻辑来找到正确的位置,并在那里添加钩子。即使如此,这也不会影响到机器上已经存在的任何存储库。
另一种方法是在全局git配置中设置init.templateDir
,从而避免了定位现有临时dir的需要。然而,这迫使您维护一切-如果将来该结构的某些基本部分发生了变化,您将需要维护和更新您的副本。
Pros:
继续使用其他每个回购钩子。
Cons:
directory
的新增内容,因为需要确定用户的git安装位置(或者完全维护自己的自定义模板目录)。
对于这两个选项,您需要确定运行这些选项的频率,以确保挂钩保持最新。您可以定期运行这些程序,也可以在进行更改时简单地推送到所有客户端机器??这都取决于您的管理工具。
不管你怎么做,精明的用户总是能够绕过它,但我猜这在大多数情况下不是一个问题。如果您的开发人员正在积极地规避一个告诉他们不要做某事的钩子,以便他们无论如何都可以这样做,那么这就不再是一个技术问题,而是一个管理问题。
https://stackoverflow.com/questions/60428861
复制相似问题