Lesstep
Azure DevOps Services・Server・REST API、Web ポータル、パイプライン、レビューのツール・2026年10月30日に確認

Azure DevOps の「TF401175: The version descriptor <Branch: … > could not be resolved to a version in the repository …」

「<Branch: と > の間の名前とちょうど同じブランチ(またはタグ)が、このリポジトリに無い」という意味です。サーバーは受け取った名前をそのまま出し、空白を1つ置いて > で閉じます。1文字ずつ読んでください。前に付いた refs/heads/、大文字と小文字の違い、末尾の空白、# のつもりの %23 は、どれもここに見えます。文の終わりには、探したリポジトリの名前が出ます。

答えの全体

2026年10月30日に dev.azure.com の公開リポジトリへ、サインインなしで、無いブランチからファイルを読んで確かめました:

GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repository}/items
    ?path=/README.md&versionDescriptor.version=no-such-branch&versionDescriptor.versionType=branch&api-version=7.1

HTTP/1.1 404 Not Found

{"$id": "1", "innerException": null,
 "message": "TF401175:The version descriptor <Branch: no-such-branch > could not be resolved to a version in the repository dotnet-public-wiki",
 "typeName": "Microsoft.TeamFoundation.Git.Server.GitUnresolvableToCommitException, Microsoft.TeamFoundation.Git.Server",
 "typeKey": "GitUnresolvableToCommitException", "errorCode": 0, "eventId": 3000}

同じ試験で TF401175 になったもの

TF401175 にならない2つ:

公開の報告に出てくる原因

  1. プルリクエストの完了のときに消されたソースブランチ。プルリクエストは sourceRefName にその名前を持ち続けるので、後から名前で読むものは TF401175 になります:マージの後片付けをする依存関係の更新サービス(2024年)、プルリクエストにコメントするスキャナー(2024年)、プルリクエストの一覧が diffs/commits?baseVersion=<ソースブランチ> で失敗した IDE のプラグイン(2024年・次の版で直った)。プルリクエストのファイルはコミットで読みます。ID はプルリクエストの lastMergeSourceCommit と lastMergeTargetCommit に残っています。
  2. パイプラインのブランチの変数をそのまま渡した。Build.SourceBranch は refs/heads/main、プルリクエストのビルドでは refs/pull/1/merge で、どちらもブランチの名前ではありません。Build.SourceBranchName では直りません。最後の部分だけなので、refs/heads/feature/tools は tools になります(Microsoft の定義済みの変数)。前を切ります:
    b="${BUILD_SOURCEBRANCH#refs/heads/}"
    プルリクエストのビルドで、レビュー中のブランチは System.PullRequest.SourceBranch です(ブランチのポリシーがビルドを走らせたときだけ入ります)。2021年には、プルリクエストを作るパイプラインのタスクが refs/pull/12/merge を baseVersion=2/merge にしていました。今は先に refs/heads/ と refs/pull/ を外しています。
  3. 別のリポジトリ。2021年、同じタスクを2つ目のリポジトリにプルリクエストを開く設定にすると、パイプラインがビルドしたブランチをそのリポジトリに尋ねていました。そのブランチは1つ目のリポジトリにしかありません。メッセージの終わりのリポジトリが、尋ねた先です。
  4. リンクが名前を変えた。2019年、エディターの「リモートで開く」のリンクが #123.fix-all-the-things というブランチを %2523123… にしていました。2回符号にしたので、サーバーは %23 で始まる名前を探しました。# の入った名前は、ちょうど1回だけ符号にします。
  5. 既定のブランチが main でない。2022年、移行のツールが、main の無いリポジトリに main を尋ねていました。GET …/repositories/{repository} の defaultBranch に、どのブランチかが出ます。

確かめること

  1. 名前は生の応答から写して、ブランチと比べます。GET …/refs?filter=heads/<名前の始まり> は、名前がそれで始まるブランチを refs/heads/… の形で並べます。
  2. リポジトリは合っていますか。探した先はメッセージに出ています。
  3. ブランチは消されていませんか。Web ポータルの Branches で名前をそのまま検索し、Search for exact match in deleted branches を選ぶと、誰がいつ消したかが出て、Restore branch で戻せます。消したブランチは期限なしで残っています(Microsoft の削除された Git ブランチを復元する)。
  4. 名前が合っていれば、種類を見ます。ブランチをタグとして尋ねると見つかりません。逆も同じです。

IntelliJ IDEA と Rider で Azure DevOps のプルリクエストを

Azure DevOps Pull Requests は、Lesstep が作っている JetBrains IDE(2024.1 以降)と Android Studio のプラグインです。組織・プロジェクト・リポジトリを git のリモートから読み、自分のレビューを待っているプルリクエストを IDE のツールウィンドウに並べます。Azure DevOps Services でも Azure DevOps Server でも使えます。プルリクエストのファイルは、プルリクエストの最後のマージのソースとターゲットのコミット ID で読むので、ソースブランチが消されても差分は止まりません。ブランチの名前を使うのはプルリクエストを作るときだけで、サーバーに無いのがソースかターゲットかを名指しで示します。レビューの受け箱と差分は無料、投票・コメント・完了・作成は Pro(30日間の無料試用つき)です。画面は日本語です。

JetBrains Marketplace で入れる

Azure DevOps は Microsoft Corporation の商標、IntelliJ IDEA と Rider は JetBrains s.r.o. の商標です。このページは Microsoft・JetBrains のいずれとも提携しておらず、承認も受けていません。

ほかに:TF401174:その版にファイルが無い · TF401398:ソースかターゲットのブランチが無い · TF401019:リポジトリが無いか、許可が無い · English