Implementation:Iterative Dvc Repo Open Repo
| Knowledge Sources | |
|---|---|
| Domains | Repository_Management, Cross_Repository |
| Last Updated | 2026-02-10 10:00 GMT |
Overview
Repo_Open_Repo is the clone and cache manager for external DVC repositories. It is implemented in dvc/repo/open_repo.py (245 lines) and provides functionality for opening local or remote DVC repositories with efficient caching, shallow clone support, and thread-safe operations.
from dvc.repo.open_repo import open_repo, clean_repos
This module is central to cross-repository operations such as dvc import, dvc get, and dvc ls when operating on remote repositories.
Public Functions
open_repo()
Opens a DVC repository from a URL or local path. Falls through to external clone if the local path is not a valid DVC repo.
Signature:
def open_repo(url, *args, **kwargs) -> Repo:
Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
url |
str |
required | Repository URL or local path (defaults to CWD if None)
|
*args |
Positional arguments forwarded to Repo() or _external_repo()
| ||
**kwargs |
Keyword arguments forwarded (including config, rev, etc.)
|
Behavior:
- If
urlisNone, defaults to the current working directory. - If
urlis an existing local path, attempts to open it directly as a DVC repo with remote config applied. OnNotDvcRepoError, falls through to external repo handling. - Otherwise, delegates to
_external_repo()for clone-based access.
clean_repos()
Cleans up all cached clones and cache directories created during the session.
Signature:
def clean_repos() -> None:
Clears the module-level CLONES and CACHE_DIRS dictionaries and removes all temporary directories from disk. Safe to call at process exit.
Internal Functions
_external_repo()
Creates a Repo instance backed by a cached clone of a remote Git repository.
@map_scm_exception()
def _external_repo(url, rev=None, **kwargs) -> Repo:
- Calls
_cached_clone()to get or create a local clone. - Defaults
revtorefs/remotes/origin/HEADwhen not specified, pointing to the tip of the remote's default branch. - Configures a cache directory and remote config for the repo instance.
- Uses
erepo_factory()to produce a factory function for subrepo creation.
_cached_clone()
Manages the clone cache. On first call for a URL, clones the repository to a temporary directory. On subsequent calls, returns the existing clone. The clone is copied (via shutil.copytree) to a separate working directory to keep the original clone clean.
def _cached_clone(url, rev) -> str:
_clone_default_branch()
Thread-safe (guarded by threading.Lock()) function that performs the actual Git clone or pull operations.
@wrap_with(threading.Lock())
def _clone_default_branch(url, rev) -> tuple[str, bool]:
Clone strategy:
- If a clone already exists and the rev is not a known SHA or is missing, performs a fetch/pull.
- For shallow clones missing a required rev, performs an unshallow operation.
- For new clones, attempts a shallow clone first when
revis a branch or tag name. Falls back to full clone onCloneError. - Returns a tuple of
(clone_path, is_shallow).
erepo_factory()
Returns a factory function for creating Repo instances within subrepos of an external repository, preserving cache configuration and remote settings.
_get_remote_config()
Extracts remote configuration from a local DVC repo. If no named remote is configured, creates an auto-generated upstream pointing to the repo's local cache directory.
_get_cache_dir()
Thread-safe function (guarded by threading.Lock()) that returns or creates a temporary cache directory for a given URL.
_pull()
Fetches updates from the remote and merges upstream. Also fetches all experiment refs via fetch_all_exps().
_merge_upstream()
Merges refs/remotes/origin/{branch} into the current branch. Silently catches SCMError (e.g., when in detached HEAD state).
_remove()
Removes a temporary directory. On Windows, retries up to 5 times with a 0.1-second timeout to handle git.exe file locks.
Module-Level State
| Variable | Type | Description |
|---|---|---|
CLONES |
dict[str, tuple[str, bool]] |
Maps URL to (clone_path, is_shallow) for cached clones
|
CACHE_DIRS |
dict[str, str] |
Maps URL to temporary cache directory path |
These dictionaries persist for the lifetime of the process and are cleared by clean_repos().
Thread Safety
_clone_default_branch()is wrapped withthreading.Lock()to prevent concurrent clone/pull operations on the same URL._get_cache_dir()is wrapped withthreading.Lock()to prevent duplicate temp directory creation.clean_repos()snapshots paths before clearing dicts to avoid visibility issues during removal.
Key Design Decisions
- Clone caching: Repositories are cloned once and reused across operations within the same process. This avoids redundant network operations for commands like
dvc importthat may access the same remote repo multiple times. - Shallow clone optimization: When the requested revision is a branch or tag name (not a SHA), a shallow clone is attempted first to reduce clone time and disk usage. Falls back to full clone if the shallow clone fails.
- Automatic unshallowing: If a shallow clone is missing a required revision, it is automatically unshallowed rather than re-cloned, preserving any local state.
- Auto-generated upstream: When an external local repo has no configured remote, an auto-generated upstream pointing to its cache directory is created, enabling cache sharing.
- Copy-on-use: The cached clone is copied via
copytreebefore use, ensuring the cached clone remains clean for future operations.
Dependencies
dvc.repo.Repo-- repository instantiationdvc.scm-- Git operations (clone,CloneError,map_scm_exception)dvc.exceptions.NotDvcRepoError-- detection of non-DVC directoriesdvc.repo.experiments.utils.fetch_all_exps-- experiment ref fetchingfuncy.retry,funcy.wrap_with-- retry logic and lock wrappingpsutil-- (indirect, via other modules)threading-- thread safety for clone operations