Brian Gan 33aaf275be sync: handle smart sync when the manifest checkout has no branch
If the manifest checkout in `.repo/manifests` is on a detached HEAD, or
on a local branch without an upstream, `Sync._GetBranch` read a missing
`merge` config and crashed with `'NoneType' object has no attribute
'startswith'`. When smart sync is enabled by default, this broke plain
`repo sync` for such checkouts because `AttributeError` bypassed the
fallback to a regular ToT sync in `_ExecuteHelper`, which only catches
`SmartSyncError` and `ManifestParseError`. Pinning the manifest via
`repo init -b <sha>` or `repo init -b refs/tags/<tag>` also sent the
raw revision to the manifest server as a branch name.

Add `ManifestProject.GetMergeBranch(heads_only=...)` (shared with
`XmlManifest._Load`) to resolve the upstream ref of the current
manifest branch, returning `None` under `heads_only=True` unless it
tracks `refs/heads/*`, and raise `SmartSyncError` in `_SmartSyncSetup`
before running the remote helper or contacting the manifest server.
Implicit smart sync now falls back to a regular ToT sync, and explicit
smart sync fails early with an actionable error message.

Bug: 580004259
Test: vpython3 run_tests
Change-Id: Ice1f9bfe7ea8c923a283bcbd0ac7576cf33e42f6
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/655123
Tested-by: Brian Gan <brgan@google.com>
Commit-Queue: Brian Gan <brgan@google.com>
Reviewed-by: Gavin Mak <gavinmak@google.com>
2026-11-11 12:02:47 -08:00
2026-01-06 11:32:42 -08:00
2026-11-09 11:14:00 -08:00
2026-06-22 16:19:30 -07:00
2021-11-15 01:39:36 +00:00
2020-02-13 04:49:55 +00:00
2026-03-18 12:01:37 -07:00
2026-05-14 09:03:56 -07:00
2026-11-05 10:50:14 -08:00
2024-12-03 22:27:56 +00:00
2025-08-21 11:04:41 -07:00
2026-10-27 02:00:11 -07:00
2019-12-02 04:23:31 +00:00
2026-11-10 12:59:38 -08:00
2025-04-01 20:59:10 -07:00
2026-11-11 09:14:21 -08:00
2026-11-11 09:14:21 -08:00
2026-11-11 09:14:21 -08:00
2025-08-21 11:04:41 -07:00

repo

Repo is a tool built on top of Git. Repo helps manage many Git repositories, does the uploads to revision control systems, and automates parts of the development workflow. Repo is not meant to replace Git, only to make it easier to work with Git. The repo command is an executable Python script that you can put anywhere in your path.

Contact

Please use the repo-discuss mailing list or issue tracker for questions.

You can file a new bug report under the "repo" component.

Please do not e-mail individual developers for support. They do not have the bandwidth for it, and often times questions have already been asked on repo-discuss or bugs posted to the issue tracker. So please search those sites first.

Install

Many distros include repo, so you might be able to install from there.

# Debian/Ubuntu.
$ sudo apt-get install repo

# Gentoo.
$ sudo emerge dev-vcs/repo

You can install it manually as well as it's a single script.

$ mkdir -p ~/.bin
$ PATH="${HOME}/.bin:${PATH}"
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
$ chmod a+rx ~/.bin/repo

Shell Completion

Repo includes completion scripts for Bash and Zsh.

Bash

To enable completion in Bash, source completion.bash in your ~/.bashrc:

source /path/to/git-repo/completion.bash

Zsh

To enable completion in Zsh, you can either:

  1. Copy or symlink completion.zsh to a file named _repo in a directory in your $fpath:

    mkdir -p ~/.zsh/completion
    # You can copy the file:
    cp /path/to/git-repo/completion.zsh ~/.zsh/completion/_repo
    # Or symlink it:
    ln -s /path/to/git-repo/completion.zsh ~/.zsh/completion/_repo
    

    Then add that directory to your fpath in ~/.zshrc before compinit:

    fpath=(~/.zsh/completion $fpath)
    autoload -Uz compinit
    compinit
    
  2. Or source the file directly and call compdef in your ~/.zshrc:

    source /path/to/git-repo/completion.zsh
    compdef _repo repo
    
S
Description
No description provided
Readme Apache-2.0
38 MiB
0 Stars 1 Watchers 0 Forks
Languages
Python 98.6%
Shell 1.4%