【问题标题】:Prevent commiting in two directiories in the same branch防止在同一分支的两个目录中提交
【发布时间】:2021-09-16 05:39:58
【问题描述】:

我有一个 git 存储库,其中包含源目录中的代码和测试目录中的测试。

我希望开发人员只能提交到同一分支中的源或测试目录。因此,如果开发人员开始使用源代码,他就不能再贡献测试,反之亦然。

对于位于另一个分支的另一个功能,人员的角色可以改变。

我正在考虑 git-hooks,尤其是客户端上的 pre-commit-hook(我知道开发人员可以解决)以及服务器上的 pre-push(开发人员无权访问 hooks 目录)。

在 git hook 脚本中,我想获取所有现有提交(如何获取分支的所有哈希?),检查它们是否在另一个目录中已经有更改,然后是有新更改的目录,或者是否有两个目录(源和测试)的新变化。

有没有更好的解决方案来满足我的需求?

更新: 该项目位于 SIL-4 环境中(参见https://en.wikipedia.org/wiki/Safety_integrity_level),因此这里不应该讨论开发人员和测试人员的权力分离感。这只是一个要求,不能更改。

【问题讨论】:

  • 我的 2c:这似乎是一个糟糕的要求——到目前为止你尝试过什么?
  • 你为什么要这样做? cmiiw,这是否意味着从测试开始的 smone 只能提交测试......而从源代码开始的 smone 只能提交源代码?
  • 如果你真的想这样做,我的想法是在路径上执行 git statusgrep。如果它同时具有源和测试路径,则不允许提交。至于开发人员从哪里开始工作,请检查所有更改文件的时间戳并获取第一个更改文件。

标签: git hash githooks


【解决方案1】:

可以这样做——也就是说,读取分支名称并根据该名称选择在下一次提交中允许的内容——但这是一个坏主意 ,有两个原因:

  1. Git 分支名称没有意义。完全可以使用多个不同的分支名称来标识一个提交。而且,如果您进行基于分支名称的限制,人们将简单地发明与任一模式都不匹配的分支名称(或使用git commit --no-verify 完全跳过测试)。

  2. 新代码需要新测试。 在编写新代码时,同时为该新代码编写新测试是完全合适的。当新代码进入时,新测试应该通过。

综上所述,编写 Git 钩子很容易:您可以选择自己喜欢的任何语言,并确保您使用的系统(操作系统)可以运行钩子。挂钩只是运行并产生退出状态的程序。 “成功”(零)的退出状态意味着提交可以继续;非零退出状态表示禁止提交。

不过,与此同时,编写一个好的 Git 钩子很难。将进入新提交的代码(文件)不一定是您在工作树中看到的文件集。相反,为新提交提议的代码是您的钩子运行时 Git 的 index 中的文件。

重要提示:请注意,如果钩子以非零值退出,则在钩子运行时位于 Git 索引中的文件可能根本不存在于任何地方。 (如果钩子产生零退出状态,允许提交继续,文件将在该提交中结束,如果没有其他问题。)特别是,当使用 git add --patchgit commit --include 和/或使用时git commit --only,为新提交建议的文件位于 临时 索引中,当 git commit 本身完成运行时,该索引将被删除。该临时索引是待提交文件作为一个整体存在的唯一位置。

【讨论】:

    猜你喜欢
    • 2017-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多