我有一个git存储库,其中包含源目录中的代码和测试目录中的测试。
我希望开发人员只能在同一分支中提交源代码或测试目录。因此,如果开发人员开始在源代码中工作,他就不允许再贡献测试,反之亦然。
对于位于另一个分支中的另一个特征,人员的角色可以改变。
我正在考虑git挂钩,尤其是客户端上的预提交挂钩(我知道开发人员可以解决(和服务器上的预推送挂钩(开发人员无法访问挂钩目录(。
在githook脚本中,我想获取所有现有的提交(我如何获取分支的所有哈希?(,检查它们是否在另一个目录中已经有更改,然后是有新更改的目录,或者两个目录(源和测试(中是否都有新更改。
有更好的解决方案来满足我的需求吗?
更新:项目位于SIL-4环境中(请参阅https://en.wikipedia.org/wiki/Safety_integrity_level(,因此,关于开发人员和测试人员的权力分离感的讨论不应包含在这里。这只是一个要求,不能更改。
您可以这样做——也就是说,读取分支名称,并根据该名称选择下一次提交时允许的内容——但这是的坏主意,原因有两个:
-
Git分支名称毫无意义。完全可以使用多个不同的分支名称来标识单个提交。而且,如果你制定基于分支名称的限制,人们只会发明与任何一种模式都不匹配的分支名称(或者使用
git commit --no-verify
完全跳过测试(。 -
新代码需要新测试在编写新代码时,同时为编写新代码的新测试是完全合适的。当新代码进入时,新测试应该通过
尽管如此,编写Git钩子很容易:你可以选择任何你喜欢的语言,只需确保你使用的系统(OS(可以运行钩子。钩子只是运行并产生退出状态的程序。退出状态为"0";成功;(零(表示提交可以继续;非零退出状态意味着提交被禁止。
然而,与此同时,编写一个好的Git钩子是难的引中的文件。
重要提示:请注意,如果钩子退出为非零,那么在钩子运行时Git索引中的文件可能根本不存在。(如果钩子产生零退出状态,允许提交继续进行,那么如果没有其他问题,文件将最终进入该提交。(特别是,当将git add --patch
与git commit --include
一起使用时和/或当使用git commit --only
时,建议用于新提交的文件位于临时索引中,当git commit
本身完成运行时,该索引将被删除。该临时索引是要提交的文件作为一个整体存在的唯一位置。