首页 > 解决方案 > CODEOWNERS:从目录中排除组(git)

问题描述

我的团队<team-1>正在与<team-2>. 回购看起来像这样(简化示例):

infrastructure/
       |
       |-- .github/CODEOWNERS 
       |
       |-- directory1/ 
               |
               |-- subdirectory1.1/
               |
               |-- subdirectory1.2/
              |
       |-- directory2/ 
               |
               |-- subdirectory2.1/
               |
               |-- subdirectory2.2/
              |
       |-- directory3/ 
               |
               |-- subdirectory3.1/
               |
               |-- subdirectory3.2/
       

<team-2>是 repo 中每个目录的 CODEOWNER,我的团队<team-1>只拥有subdirectory1.1subdirectory2.1.

换句话说,CODEOWNERS 文件看起来像这样:

github/代码所有者

* @mycompany/team2
/infrastructure/directory1/subdirectory1.1 @mycompany/team1
/infrastructure/directory1/subdirectory1.1 @mycompany/team1

鉴于上述情况,我想做的是team2从 team1 拥有的每个文件夹中排除,理想情况下不删除 codeowners 文件中的通配符。

* @mycompany/team2
/infrastructure/directory1/subdirectory1.1 @mycompany/team1 AND EXCLUDE TEAM2
/infrastructure/directory1/subdirectory1.1 @mycompany/team1 AND EXCLUDE TEAM2

在不重写整个代码所有者逻辑的情况下,最好的方法是什么?

标签: github

解决方案


如果“代码所有者”是指对文件夹的推送/写入访问权限,则 Git 或 GitHub 本身不支持这一点:如果您可以推送到存储库的一部分,则可以推送到所有存储库。

您可能会考虑推送到您控制的服务器上的中间网关存储库,并且您可以在其中设置授权层,例如gitolite

使用 Gitolite,您可以使用 VREF 通过更改的目录和文件的名称限制推送。

在你的情况下:

repo foo
        RW+                             =   @team2
        R                               =   @team1

        RW   VREF/NAME/infrastructure/directory1/subdirectory1.1 @team1
        RW   VREF/NAME/infrastructure/directory1/subdirectory2.1 @team1

一旦 Gitolite 验证了推送,同一台服务器就可以反过来推送到 GitHub。


但更自然的方法是将存储库一分为二,将主父 teeam2 存储库中的 team1 内容引用为submodule
但这并不容易,考虑到它会涉及历史重写和文件夹重组。


推荐阅读