【问题标题】:Enforcing and creating Git policies执行和创建 Git 策略
【发布时间】:2017-02-20 00:24:20
【问题描述】:

我的任务是稍微更改 Git,但未能在互联网上找到任何相关信息 - 我急需指导。

我们拥有的: 一堆分支,主要是test(基本上是develop)和master分支。 master 大部分时间都没有动过。

现在,我使用 TeamCity、Jira 和 Crucible 以及自己编写的服务创建了一个持续集成环境。

我们想要达到的目标:

  1. 不允许推送到 test - 除非是 TeamCity
  2. 如果 id==branchName 的 Jira 问题处于错误状态,则拒绝推送功能分支

现在, ad1)我不知道这样的事情是如何实现的。我可能只是误解了 Git 助手对我说的内容,但是当我阅读时,我可以完全禁止,也可以完全允许。

ad2) 名义上很容易,因为我知道必须使用预推送挂钩脚本,但它也必须放在每个开发人员的本地 git 存储库中,或者我可以以某种方式强制执行吗?

【问题讨论】:

  • 你是使用 gitlab 还是 github 来托管你的 repos?每个都支持您正在寻找的东西。我不确定您是否可以使用原始存储库做您想做的事情。
  • -我使用的是github-在标题中说明-
  • 其实我错了,我们在 ubuntu 上托管了一个原始 repo

标签: linux git githooks


【解决方案1】:

正如@chicks 所说,您绝对可以使用 GitLab 之类的工具获得所需的功能。用户限制(如“只有 teamcity 对此分支有写访问权限”)是开箱即用的,并且通常支持服务器端挂钩,您可以使用这些挂钩来实现您的第二个要求。

可能您自己实现相同的限制,只需通过 ssh 提供 git 存储库,但这需要您进行一些开发工作。一般模型为:

  • 为您的 git 用户配置 .ssh/authorized_keys 以包含可用于识别与传入推送关联的用户的元数据,
  • 编写 Git 挂钩脚本以执行每个分支的访问控制或策略实施。

到处都有做这些事情的例子;例如,this 是我写的一个较旧的答案,描述了如何确保提交时的电子邮件地址与连接用户的身份匹配。

使用像 GitLab 这样的预打包解决方案几乎总是比尝试自己动手更有意义。

【讨论】:

  • 我花了一些时间来处理这个问题,所以基本上不是完全阻止推送,我应该创建一个 pre-push 挂钩脚本来阻止来自某些用户的推送,同时允许其他用户。谢谢!
  • 因此,作为记录,pre-push 脚本在 客户端 端运行,对于 执行 策略无用(因为客户端可以只需在克隆存储库时有意或仅通过不启用它来禁用它)。对于策略实施,您需要像 pre-receiveupdate 这样的服务器端挂钩。
  • 我刚刚发现了这一点。我已经使用 pre-push hook 成功创建了一个 bash 脚本,所以现在我只需要将它转换为 pre-receive hook :) 非常感谢。作为记录,我只使用了 bash (!/bin/bash),我用 curl 调用 jira。
猜你喜欢
  • 2014-07-13
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
相关资源
最近更新 更多