Azure DevOps の「TF401027: You need the Git 'GenericContribute' permission to perform this action.」
「この操作には Git の 'GenericContribute' の許可が要る」という意味です。TF401027 は、メッセージの identity のアカウントに、リポジトリかブランチの Git の許可が1つ無いことを名指ししています。Azure DevOps の中の許可の話で、トークンの権限(スコープ)や git の資格情報の話ではありません。サインインし直しても、トークンを作り直しても変わりません。プロジェクトの管理者が Project settings → Repositories → Security で付けます。パイプラインなら、相手はビルド サービスのアカウントです。
答えの全体
2020年〜2026年10月の公開の報告が引いている形です。git push なら remote: の行に、REST API なら HTTP 403 の JSON の message に出ます:
TF401027: You need the Git 'GenericContribute' permission to perform this action. Details: identity 'Build\<GUID>', scope 'repository'.
引用符の中の名前は断られた操作で変わり(CreateBranch・PullRequestContribute・ForcePush など)、identity は許可が無いアカウント、scope は repository か branch です。私たち自身ではこの答えを起こしていません。上の行は、読んだ報告のどれもが引いている形です。
どの許可か
メッセージの名前は Azure DevOps の中の名前です。Security の画面ではこう呼ばれます(Microsoft の許可の一覧):
GenericContribute= Contribute:ブランチにコミットを push する。CreateBranch= Create branch:まだ無いブランチを push する。CreateTag= Create tag:タグを push する。ForcePush= Force push (rewrite history, delete branches and tags):履歴の書き換え・ブランチやタグの削除。PullRequestContribute= Contribute to pull requests:プルリクの作成・コメント・投票。PullRequestBypassPolicy= Bypass policies when completing pull requests:ポリシーを飛ばしてプルリクを完了する。
既定では(Set Git repository permissions)、プロジェクトの Readers は Read と Contribute to pull requests を持ち、Contributors はそれに加えて Contribute・Create branch・Create tag・Manage notes を持ちます。Force push と2つの Bypass は、どのグループにも付いていません。なので、人が GenericContribute や CreateBranch で TF401027 になるのは、たいてい Readers にしか入っていないか、どれかのグループの Deny(Allow より強い)に当たっているときです。
だれの許可か
- 人(
identityが名前かメール):そのアカウントです。どのトークンやサインインを使っていても同じです。 Build\<GUID>:パイプラインが、ビルド サービスのアカウントとして動いています。Limit job authorization scope to current project for non-release pipelines が入なら<プロジェクト> Build Service (<組織>)、切ならProject Collection Build Service (<組織>)です(Microsoft)。既定では、リポジトリを読めても push はできません。scope 'branch':ブランチ自身の許可(Repos → Branches → ブランチの … → Branch security)で断られています。リポジトリで許していても、ブランチで拒めます。
許可を付ける
- プロジェクトの管理者(かリポジトリの Manage permissions を持つ人)が、Project settings → Repositories を開きます。
- プロジェクトのすべてのリポジトリなら All Repositories → Security、1つならそのリポジトリを選んで Security。
- メッセージのユーザー・グループ・ビルド サービスのアカウントを探し、その許可を Allow にします。Azure DevOps Services はその場で保存され、Azure DevOps Server では Save changes を押します。
- もう Allow なのに断られるなら、そのアカウントのグループかブランチに Deny が無いかを見ます。
push するパイプラインについて、Microsoft の Run Git commands in a script は、Users の下の <プロジェクト名> Build Service (<組織>) を選んで Create branch・Contribute・Read・Create tag を許し、git push がジョブのトークンを使えるように checkout に persistCredentials: true を付けています:
steps: - checkout: self persistCredentials: true
必須のポリシーがあるブランチへの push の断りは、別の文 TF402455 です:新しいブランチへ push してプルリクを作る。
IntelliJ IDEA と Rider で Azure DevOps のプルリクエストを
Azure DevOps Pull Requests は、Lesstep が作っている JetBrains IDE(2024.1 以降)と Android Studio のプラグインです。自分のレビューを待っているプルリクエストを IDE のツールウィンドウに並べます。Azure DevOps Services でも Azure DevOps Server でも使えます。投票とコメントにはアカウントの Contribute to pull requests を使い、これは Readers と Contributors に既定で付いています。1.0.34 からは、Azure DevOps が TF401027 で変更を断ったとき、足りない許可を Security の画面の名前で出し、付ける場所を案内します(別のトークンを求めません)。レビューの受け箱は無料、投票・コメント・完了は Pro(30日間の無料試用つき)です。画面は日本語です。
Azure DevOps は Microsoft Corporation の商標、IntelliJ IDEA と Rider は JetBrains s.r.o. の商標です。このページは Microsoft・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:TF401019:リポジトリが無いか、権限が無い · IntelliJ IDEA 2025.2 以降で使える Azure DevOps のプラグイン · English