fix: strip remote prefix from branch names in list_branches

Git branch -a --format=%(refname:short) returns remote branches as
'origin/branch-name', not 'remotes/origin/branch-name'. The code was
only filtering 'remotes/' prefix, causing clone to fail with branch
names like 'origin/feat/foo'.

Now properly detects remote names using 'git remote' and strips the
remote prefix (e.g., 'origin/') from branch names.
This commit is contained in:
2026-05-24 10:25:01 +00:00
parent 01aaf4c78f
commit 802d8f1e8c
2 changed files with 27 additions and 10 deletions
File diff suppressed because one or more lines are too long
+21 -3
View File
@@ -289,14 +289,32 @@ def list_branches(repo_path: str) -> tuple[list[BranchInfo], str]:
branches: list[BranchInfo] = [] branches: list[BranchInfo] = []
default_branch = "main" default_branch = "main"
# Get list of remote names to properly filter remote tracking branches
try:
remote_output = _run_git_command(repo_path, "remote")
remote_names = {r.strip() for r in remote_output.strip().split("\n") if r.strip()}
except RuntimeError:
remote_names = set()
for line in output.strip().split("\n"): for line in output.strip().split("\n"):
if not line: if not line:
continue continue
branch_name = line.strip() branch_name = line.strip()
# Skip remote tracking branches (they start with remotes/)
if branch_name.startswith("remotes/"): # Skip detached HEAD pointer
# Extract just the branch name part if branch_name == "HEAD":
continue
# Skip remote tracking branches - they appear as "origin/branch-name"
# Check if first part is a remote name
if "/" in branch_name:
first_part = branch_name.split("/", 1)[0]
if first_part in remote_names:
# Extract just the branch name part (after "origin/")
branch_name = branch_name.split("/", 1)[1]
elif branch_name.startswith("remotes/"):
# Handle "remotes/origin/branch-name" format
parts = branch_name.split("/", 2) parts = branch_name.split("/", 2)
if len(parts) >= 3: if len(parts) >= 3:
branch_name = parts[2] branch_name = parts[2]