def _clone_default_branch(url, rev, for_write=False): """Get or create a clean clone of the url. The cloned is reactualized with git pull unless rev is a known sha. """ from dvc.scm.git import Git clone_path, shallow = CLONES.get(url, (None, False)) git = None try: if clone_path: git = Git(clone_path) # Do not pull for known shas, branches and tags might move if not Git.is_sha(rev) or not git.has_rev(rev): if shallow: # If we are missing a rev in a shallow clone, fallback to # a full (unshallowed) clone. Since fetching specific rev # SHAs is only available in certain git versions, if we # have need to reference multiple specific revs for a # given repo URL it is easier/safer for us to work with # full clones in this case. logger.debug("erepo: unshallowing clone for '%s'", url) _unshallow(git) shallow = False CLONES[url] = (clone_path, shallow) else: logger.debug("erepo: git pull '%s'", url) git.pull() else: logger.debug("erepo: git clone '%s' to a temporary dir", url) clone_path = tempfile.mkdtemp("dvc-clone") if not for_write and rev and not Git.is_sha(rev): # If rev is a tag or branch name try shallow clone first from dvc.scm.base import CloneError try: git = Git.clone(url, clone_path, shallow_branch=rev) shallow = True logger.debug( "erepo: using shallow clone for branch '%s'", rev ) except CloneError: pass if not git: git = Git.clone(url, clone_path) shallow = False CLONES[url] = (clone_path, shallow) finally: if git: git.close() return clone_path, shallow
def _clone_default_branch(url, rev): """Get or create a clean clone of the url. The cloned is reactualized with git pull unless rev is a known sha. """ clone_path = CLONES.get(url) git = None try: if clone_path: git = Git(clone_path) # Do not pull for known shas, branches and tags might move if not Git.is_sha(rev) or not git.has_rev(rev): logger.debug("erepo: git pull %s", url) git.pull() else: logger.debug("erepo: git clone %s to a temporary dir", url) clone_path = tempfile.mkdtemp("dvc-clone") git = Git.clone(url, clone_path) CLONES[url] = clone_path finally: if git: git.close() return clone_path
def clone(url, to_path, rev=None): from dvc.scm.git import Git git = Git.clone(url, to_path, rev=rev) git.close() return Repo(to_path)
def clone(url: str, to_path: str, **kwargs): from dvc.scm.exceptions import CloneError as InternalCloneError with TqdmGit(desc="Cloning") as pbar: try: return Git.clone(url, to_path, progress=pbar.update_git, **kwargs) except InternalCloneError as exc: raise CloneError(str(exc))
def _init_clone(self): src_dir = self.repo.scm.root_dir logger.debug("Initializing experiments clone") git = Git.clone(src_dir, self.exp_dir) self._config_clone() return git
def _clone_repo(url, path): from dvc.scm.git import Git git = Git.clone(url, path) git.close()