Brian Gan 1e88f21cb1 sync: remove obsolete projects before interleaved checkouts
In `_SyncInterleaved`, `_UpdateManifestLists` only ran after fetching
and checking out all projects. When a manifest replaced a parent project
`foo` with a nested child project `foo/bar`, `foo/bar` was checked out
inside the still-existing obsolete `foo` worktree before
`UpdateProjectList` deleted `foo`. Because `bar/` was tracked by `foo`,
`git status` in `foo` saw `foo/bar`'s newly checked-out files as
modified and untracked files belonging to `foo`, causing
`DeleteWorktree` to fail with `DeleteDirtyWorktreeError` (and similarly,
when `foo/bar` was merged back into `foo`, `foo`'s checkout collided
with the not-yet-deleted `foo/bar` worktree):

  error: foo: Cannot remove project: uncommitted changes are present.
  error: Unable to fully sync the tree
  error: Updating local project lists failed.

Split `_UpdateManifestLists` into `_UpdateProjectLists` and
`_UpdateCopyLinkfileLists`, and run `_UpdateProjectLists` before the
sync loop in `_SyncInterleaved` so obsolete manifest projects are
deleted before new project checkouts begin (and `--fail-fast` aborts
before fetching if an obsolete project cannot be removed). Run
`_UpdateProjectLists` again after the sync loop (passing the set of
paths that already failed removal pre-sync so they are not retried or
reported twice) together with `_UpdateCopyLinkfileLists` so derived
submodules discovered or dropped when `_ReloadManifest` runs during the
loop are updated in `project.list` and copyfiles/linkfiles are updated.

Because the pre-sync `_UpdateProjectLists` pass in `_SyncInterleaved`
runs before projects are fetched (unlike `_SyncPhased`, which runs it
after `_FetchMain`), a `sync-s="true"` parent project whose manifest
revision moved to an unfetched commit cannot derive its submodules yet
(`GetSubmoduleRevisions() is None`). Retain existing submodule checkouts
under such parents until a post-fetch pass can determine whether their
submodules were removed. Also continue past individual
`DeleteWorktreeError` failures in `UpdateProjectList` (skipping obsolete
ancestors of any retained child worktree) so remaining clean obsolete
projects are still removed while failed paths stay tracked in
`project.list`, and skip project list and copy/linkfile updates when
`--network-only` is set so `-n` does not mutate local worktrees.

Bug: 574048485
Test: vpython3 run_tests
Change-Id: I530337977f063173a9a8a48df3250627cd4bc57f
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/656283
Commit-Queue: Brian Gan <brgan@google.com>
Reviewed-by: Gavin Mak <gavinmak@google.com>
Tested-by: Brian Gan <brgan@google.com>
2026-11-10 15:25:06 -08:00
2026-01-06 11:32:42 -08:00
2026-11-09 11:14:00 -08:00
2026-11-10 12:59:38 -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
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
39 MiB
0 Stars 1 Watchers 0 Forks
Languages
Python 98.6%
Shell 1.4%