Gavin Mak a468ea7752 sync: implement reprojectcmd for the local half
Add `repo.reprojectcmd`, the checkout counterpart to `repo.fetchcmd`.
When set, `repo sync` runs this command instead of Git to materialize a
project's index and worktree at the target tree, while `repo` handles
ref updates directly via `git update-ref`.

This replaces Git's tree materialization steps: detaching HEAD,
fast-forwarding, and hard-resetting. Rebasing is not delegated, and the
command is skipped if HEAD is already at the target, if HEAD is ahead of
the target during fast-forward, or for MetaProjects.

The command runs in a subshell with project environment variables (such
as `REPO_TREV`). Before running, `repo` ensures no operation is in
progress and no staged changes exist. Worktree collision detection is
delegated to the command (preserving benign unstaged/untracked edits).
Afterward, `repo` verifies that HEAD was untouched and that the index
matches the target tree.

Like `repo.fetchcmd`, this requires `repo.uselocalgitdirs`. Nested
projects and submodules are unsupported; `repo sync` fails if the
manifest contains any while `repo.reprojectcmd` is enabled.

Verified end-to-end with repo init using local-gitdirs, repo.fetchcmd,
and repo.reprojectcmd ('git -C $REPO_PATH read-tree -m -u $REPO_TREV'):
  * Verified detached HEAD checkout and correct reflog generation across
    projects.
  * Verified benign unstaged edits and untracked files survive checkout.
  * Verified conflicting untracked files fail with exit 128 without
    clobbering worktree.
  * Verified staged changes fail upfront before reprojectcmd is executed.

Bug: 513329573
Change-Id: I964d24d22dccffc05a9b991ad69f3a7e93268c01
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/626281
Tested-by: Gavin Mak <gavinmak@google.com>
Reviewed-by: Brian Gan <brgan@google.com>
Commit-Queue: Gavin Mak <gavinmak@google.com>
2026-09-15 12:53:01 -07:00
2026-01-06 11:32:42 -08:00
2026-07-01 15:45:23 -07:00
2025-04-23 08:33:37 -07: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
2024-12-03 22:27:56 +00:00
2025-08-21 11:04:41 -07:00
2019-12-02 04:23:31 +00:00
2025-04-01 20:59:10 -07: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
36 MiB
Languages
Python 98.3%
Shell 1.7%