VSTS - 防止推送到 master 但允许 PR 合并

Posted

技术标签:

【中文标题】VSTS - 防止推送到 master 但允许 PR 合并【英文标题】:VSTS - prevent push to master but allow PR merge 【发布时间】:2017-07-31 21:10:03 【问题描述】:

我们在 VSTS 中设置了分支策略,以防止拉取请求被合并到 master 中,除非构建通过和工作项已链接。但是,我不知道如何防止开发人员直接推送到 master。将“贡献”权限设置为拒绝不允许合并拉取请求。

应允许所有开发人员将 PR 合并到 master,但不应允许任何开发人员直接推送到 master。这可能吗?

【问题讨论】:

【参考方案1】:

Branch policies 已经完全按照你说的做。当分支策略到位时,需要 PR。

确保您的开发人员没有“豁免政策强制执行”权限。

【讨论】:

你能详细说明这在使用纯 Git 的本地存储库上是如何工作的吗?大概用户可以对他们自己的本地版本的 master 分支做任何事情,但是 Azure DevOps 会拒绝推送到远程?如果/当这种情况发生时,开发人员需要做些什么来消除他们在本地仓库中陷入的混乱局面? 我们应该在哪里查看开发人员是否拥有“豁免政策执行”权限?我们在主分支的策略中强制执行拉取请求,但刚刚发现开发人员仍然可以提交并直接推送到主分支。 这是一个更广泛的答案,它不能解决问题。我们需要设置哪个确切的分支策略? 我问自己和上面一样的事情。仔细查看链接后,我看到以下问答部分让我很清楚。任何必需的分支策略都将导致无法直接推送。无论如何,我没有尝试更改选项。 docs.microsoft.com/en-us/azure/devops/repos/git/…【参考方案2】:

我知道这个问题有点老了,但这里有一些额外的信息...... 不幸的是,我无法将 cmets 添加到“最佳答案”中,所以这是一个新答案,您可以将其视为评论:

分支机构政策已经完全按照您的要求行事。当分支策略到位时,需要 PR。

100% 同意

确保您的开发人员没有“豁免政策执行”权限。

100% 同意

免于执行政策

我们应该在哪里查看开发人员是否拥有“豁免政策执行”权限?

来自docs.microsoft.com:

有几种权限允许用户绕过分支策略。在 TFS 2015 到 TFS 2018 更新 2 中,免于强制执行权限允许具有此权限的用户执行以下操作:

在完成拉取请求时,选择加入以覆盖策略并完成拉取请求,即使当前的分支策略集不满足。 直接推送到一个分支,即使该分支设置了分支策略。请注意,当具有此权限的用户进行会覆盖分支策略的推送时,推送会自动绕过分支策略,而无需选择加入步骤或警告。

在 Azure DevOps Services 中,免于强制执行权限被移除,其功能分为以下两个新权限:

完成拉取请求时绕过政策 推送时绕过政策

以前启用免于执行政策的用户现在改为启用这两个新权限。

您可以在以下位置找到这些选项:organization / project / Settings / Repositories

本地 Git

大概用户可以对他们自己的本地版本的 master 分支做任何事情,但是 Azure DevOps 会拒绝推送到远程?如果/当这种情况发生时,开发人员需要做些什么来消除他们在本地存储库中陷入的混乱局面?

之所以如此,是因为 Azure DevOps 中的分支策略不是我们称之为“vanilla-git”的。这是 Microsoft 特定的扩展,与您用户的本地 git 分支无关。因此,用户可以对他的本地 git 存储库做任何他想做的事情 - DevOps 只是阻止了一些“服务器端”的东西。 关于开发人员如何消除混乱的问题: 我推荐this SO question。

【讨论】:

【参考方案3】:

我没有声望点可以在答案中发表评论,所以我会在这里发布一个新的。

当您将主分支策略设置为Require a minimum number of reviewers 时,主分支将自动受到保护。您将无法推送任何提交。为了进行任何更改,您需要创建一个新分支,并创建一个拉取请求以合并修改。

【讨论】:

这是我一直在寻找的简单答案。谢谢@William

以上是关于VSTS - 防止推送到 master 但允许 PR 合并的主要内容,如果未能解决你的问题,请参考以下文章

如何知道对 master 的最新提交是不是已推送到远程?

如何授予语义释放权限以将代码推送到 master

防止 viewcontroller 被推送到 splitviewcontroller 两次

git 强制推送到master

Rxjs:防止将数据推送到服务之外的主题

将本地提交的更改推送到新分支