针对需求,需对部分文件夹配置Git保护,禁止用户提交修改。查得Gitlab提供两种方式实现文件锁定:一为使用git lfs实现管理员账号独占锁;二为Gitlab默认分支保护,仅专业版支持目录及文件锁定。第一种方式需为每个文件单独加锁,操作繁琐且不确定对普通文件的影响,故放弃。第二种方式不支持自定义分支保护,社区版不支持,同样放弃。
决定在本地仓库中自定义文件提交校验,对保护文件进行检查。创建.git/hooks/pre-commit文件并赋予执行权限。此脚本将在提交前执行,通过检查变更文件列表,如包含保护目录src/components/下的文件,则终止提交并提示错误。
尽管如此,.git目录无法提交至远程仓库,需确保所有开发人员在本地仓库配置hooks脚本,这显得不够友好。于是,网上找到了项目typicode.github.io/husk,此项目可实现hooks脚本分发,通过将所有hooks指向仓库中的husky脚本,再由husky执行自定义脚本。然而,此方案要求开发人员安装husky,运维问题则由运维解决,方案不可行。
幸运的是,Git服务端也提供hooks接口,Gitlab接收到commit请求的节点可进行变更检查。首先需找到仓库在Gitlab服务器上的物理地址。默认路径为/var/opt/gitlab/git-data/repositories,早期版本中,仓库按group层级保存于此目录下,新版本创建的仓库保存在@hashed目录下。仓库以projectId的sha256哈希值为文件夹名存储,测试仓库id为1471,执行echo -n "1471" | sha256sum得到结果f64ee82a9f4a0451528059f6302d3ec67c5a3d3616392a86bf88df4bb451a3b3,因此仓库存储地址为/var/opt/gitlab/git-data/repositories/@hashed/f6/4e/f64ee82a9f4a0451528059f6302d3ec67c5a3d3616392a86bf88df4bb451a3b3.git。
进入该文件夹,创建custom_hooks文件夹,在其中创建pre-receive文件并赋予执行权限。通过Git服务器钩子,实现全分支的文件保护。
通过上述方式,成功实现文件夹保护功能,且无需额外安装或配置,有效保护了特定文件夹的安全性,提高了项目管理的效率与便捷性。
温馨提示:答案为网友推荐,仅供参考