

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 限制推送和合并到中的分支 Amazon CodeCommit
<a name="how-to-conditional-branch"></a>

默认情况下，任何拥有足够权限将代码推送到存储 CodeCommit 库的存储库用户都可以为该仓库中的任何分支做出贡献。无论是使用控制台、命令行或 Git，您以何种方式在存储库中添加分支情况都是如此。但是您可能希望对某一分支进行配置，只允许存储库的一些用户向该分支推送或合并代码。例如，您可能希望配置一个生产代码所用的分支，只有一部分高级开发人员才能在该分支上推送或合并更改。其他开发人员仍可从该分支拉取内容，生成他们自己的分支并创建拉取请求，但他们不能将更改推送或合并到该分支。您可以在 IAM 中创建条件策略，针对一个或多个分支使用上下文键，从而配置此访问权限。

**注意**  
要完成本主题中的一些步骤，您必须作为管理员用户登录，该用户需拥有配置并应用 IAM 策略的足够权限。有关更多信息，请参阅[创建 IAM 管理员用户和组](https://docs.amazonaws.cn/IAM/latest/UserGuide/getting-started_create-admin-group.html)。

**Topics**
+ [配置 IAM 策略以限制针对分支的推送和合并](#how-to-conditional-branch-create-policy)
+ [将 IAM 策略应用于 IAM 组或角色](#how-to-conditional-branch-apply-policy)
+ [测试策略](#how-to-conditional-branch-test)

## 配置 IAM 策略以限制针对分支的推送和合并
<a name="how-to-conditional-branch-create-policy"></a>

您可以在 IAM 中创建一个策略，阻止用户更新分支，包括向分支推送提交以及将拉取请求合并到分支。为此，您的策略需使用条件语句，只在满足条件时才应用 `Deny` 语句的效果。 APIs 您在`Deny`语句中包含的内容决定了不允许执行哪些操作。您可以将此策略配置为只应用于一个存储库中的一个分支，应用于一个存储库中的多个分支，或应用于一个 Amazon Web Services 账户的所有存储库中满足条件的所有分支。<a name="how-to-conditional-branch-create-policy-procedure"></a>

**为分支创建条件策略**

1. 登录 Amazon Web Services 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择**策略**。

1. 选择**创建策略**。

1. 选择 **JSON**，然后粘贴以下示例策略。将 `Resource` 的值替换为存储库的 ARN，其中包含您希望限制访问权限的分支。将 `codecommit:References` 的值替换为您希望限制访问权限的一个或多个分支的引用。例如，该策略拒绝针对名为 *`main`* 的分支和名为 `prod` 的分支（位于名为 `MyDemoRepo` 的存储库中）推送提交、合并分支、删除分支、删除文件、合并拉取请求和添加文件：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": [
                   "codecommit:GitPush",
                   "codecommit:DeleteBranch",
                   "codecommit:DeleteFile",
                   "codecommit:PutFile",
                   "codecommit:MergeBranchesByFastForward",
                   "codecommit:MergeBranchesBySquash",
                   "codecommit:MergeBranchesByThreeWay",
                   "codecommit:MergePullRequestByFastForward",
                   "codecommit:MergePullRequestBySquash",
                   "codecommit:MergePullRequestByThreeWay"
               ],
               "Resource": "arn:aws:codecommit:us-east-2:111111111111:MyDemoRepo",
               "Condition": {
                   "StringEqualsIfExists": {
                       "codecommit:References": [
                           "refs/heads/main", 
                           "refs/heads/prod"
                        ]
                   },
                   "Null": {
                       "codecommit:References": "false"
                   }
               }
           }
       ]
   }
   ```

------

   Git 中的分支只是 HEAD 提交 SHA-1 值的指针 (引用)，这就是条件使用 `References` 的原因。如果策略的效果是 `Deny`，而且其中一个操作是 `GitPush`，则 `Null` 语句是必需的，这是由 Git 和 `git-receive-pack` 将更改从本地存储库推送到 CodeCommit 的工作原理决定的。
**提示**  
要创建一个策略来应用于 Amazon Web Services 账户的所有存储库中所有名为 main 的分支，请将 `Resource` 的值从存储库 ARN 改为星号 (`*`)。

1. 选择**查看策略**。更正策略语句中的所有错误，然后继续**创建策略**。

1. JSON 经过验证后，将显示**创建策略**页面。**摘要**部分出现一条警告，告知此策略不会授予权限。这是预期行为。
   + 在**名称**中，输入此策略的名称，例如 **DenyChangesToMain**。
   + 在**描述**中，输入策略用途的描述。您可以自由选择，但我们建议您这样做。
   + 选择**创建策略**。

## 将 IAM 策略应用于 IAM 组或角色
<a name="how-to-conditional-branch-apply-policy"></a>

您已创建一个策略来限制针对某一分支的推送和合并，但该策略在应用于 IAM 用户、组或角色后才会生效。作为最佳实践，请考虑将该策略应用于 IAM 组或角色。将策略应用于单个 IAM 用户无法很好地扩展。<a name="how-to-conditional-branch-apply-policy-procedure"></a>

**将条件策略应用于组或角色**

1. 登录 Amazon Web Services 管理控制台 并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，如果您希望针对 IAM 组应用策略，请选择**组**。如果您希望针对用户代入的角色应用策略，请选择**角色**。选择组或角色的名称。

1. 在**权限**选项卡上，选择**附加策略**。

1. 从策略列表中选择您创建的条件策略，然后选择**附加策略**。

有关更多信息，请参阅[附加和分离 IAM 策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

## 测试策略
<a name="how-to-conditional-branch-test"></a>

您应测试策略针对组或角色应用的效果，确保与预期效果相同。您可以使用多种方法进行测试。例如，要测试与上述策略类似的策略，您可以：
+ 使用 IAM 用户登录 CodeCommit 控制台，该用户要么是已应用策略的 IAM 群组的成员，要么担任已应用该策略的角色。在控制台中，向受限分支添加文件。您在尝试向该分支保存或上传文件时，应看到一条错误消息。将文件添加到其他分支。这次操作应该会成功。
+ 使用 IAM 用户登录 CodeCommit 控制台，该用户要么是已应用策略的 IAM 群组的成员，要么担任已应用该策略的角色。创建将合并到受限分支的拉取请求。您应该能够创建拉取请求，但在尝试合并时会出现错误。
+ 在终端或命令行中，在适用限制的分支上创建提交，然后将该提交推送到 CodeCommit 存储库。您应该看到一条错误消息。从其他分支进行的提交和推送应该是正常的。