phacility/phabricator · error · Exception

Commit " " is not an ancestor of any branch head, so it can…

Error message

Commit "%s" is not an ancestor of any branch head, so it can not be built with Buildkite.

What it means

getBuildkiteBranch() (PhabricatorRepositoryCommit.php:741-769) runs diffusion.branchquery with 'contains' => commit identifier to find branch heads that contain the commit, then returns 'refs/heads/<branch>' for Buildkite. If no branch head has the commit as an ancestor, there is no ref Buildkite can build, so it throws.

Solutions

  1. Ensure the commit is pushed as (or merged into) a real branch head before the Buildkite step runs, e.g. publish the Diff or push the branch
  2. Resync the mirror so the branch query sees current refs: bin/repository update / re-run discovery for the repository
  3. Configure the build plan so the Buildkite step only runs on final (published) builds rather than draft builds
Defensive patterns

Strategy: validation

Validate before calling

// Pre-flight: ask which branches contain the commit, mirroring the step.
$branches = DiffusionQuery::callConduitWithDiffusionRequest(
  PhabricatorUser::getOmnipotentUser(),
  DiffusionRequest::newFromDictionary(array(
    'repository' => $repository,
    'user' => PhabricatorUser::getOmnipotentUser(),
  )),
  'diffusion.branchquery',
  array(
    'contains' => $commit->getCommitIdentifier(),
    'repository' => $repository->getPHID(),
  ));
if (!$branches) {
  // not on any branch head: do not run the Buildkite step yet
}

Type guard

function isOnBranchHead(
  PhabricatorRepository $repository,
  PhabricatorRepositoryCommit $commit) {
  // Cheap heuristic: tag-only or unpublished commits are risky; verify via
  // diffusion.branchquery 'contains' before building.
  return (bool)DiffusionBranchQuery::callConduitWithDiffusionRequest(
    null, null, 'diffusion.branchquery',
    array('contains' => $commit->getCommitIdentifier()));
}

Try / catch

try {
  $branch = $commit->getBuildkiteBranch();
} catch (Exception $ex) {
  // Commit not on any branch head (deleted branch, tag-only, unpublished
  // diff): fail the build target with the message; retry after the commit
  // is pushed to a branch.
  $build_target->log($ex->getMessage());
  throw new HarbormasterBuildFailureException();
}

Prevention

When it happens

Trigger: A Buildkite build step runs on a buildable whose commit is reachable only from tags, pushed under refs/diff/* or another non-branch ref, on a branch deleted/force-pushed before the build executed, or not pushed to the remote at all (pre-publish draft builds).

Common situations: Building Differential patch/Diff branches that were never pushed as real branches; racing a force-push or branch deletion in a fast-moving mirror; tag-only release commits; stale mirrors whose refs have not been updated yet.

Related errors


AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21). Data as JSON: /api/errors/a60f0c8488f02a59. Report an issue: GitHub.

Appendix: source

Thrown at src/applications/repository/storage/PhabricatorRepositoryCommit.php:759

  public function getBuildkiteBranch() {
    $viewer = PhabricatorUser::getOmnipotentUser();
    $repository = $this->getRepository();

    $branches = DiffusionQuery::callConduitWithDiffusionRequest(
      $viewer,
      DiffusionRequest::newFromDictionary(
        array(
          'repository' => $repository,
          'user' => $viewer,
        )),
      'diffusion.branchquery',
      array(
        'contains' => $this->getCommitIdentifier(),
        'repository' => $repository->getPHID(),
      ));

    if (!$branches) {
      throw new Exception(
        pht(
          'Commit "%s" is not an ancestor of any branch head, so it can not '.
          'be built with Buildkite.',
          $this->getCommitIdentifier()));
    }

    $branch = head($branches);

    return 'refs/heads/'.$branch['shortName'];
  }

  public function getBuildkiteCommit() {
    return $this->getCommitIdentifier();
  }


/* -(  PhabricatorCustomFieldInterface  )------------------------------------ */

View on GitHub (pinned to 5720a38cfe)