def get_files(self, repo: str, branch: str, *,<EOL>depth: Optional[int]=<NUM_LIT:1>,<EOL>reference: Optional[Path]=None<EOL>) -> Tuple[Repo, Path]:
repo_path = self.get_path_to_repo_and_branch(repo, branch)<EOL>logger.info("<STR_LIT>", repo_path)<EOL>if repo_path.exists():<EOL><INDENT>git_repo = Repo.init(repo_path)<EOL>repo_id = self.repo_id(repo)<EOL>if not self.single_pull or self._current_hashes[repo_id].get(branch) is None:<EOL><INDENT>logger.info("<STR_LIT>")<EOL>self._pull(git_repo=git_repo, branch=branch)<EOL><DEDENT>else:<EOL><INDENT>logger.info("<STR_LIT>")<EOL><DEDENT><DEDENT>else:<EOL><INDENT>repo_path.parent.mkdir(exist_ok=True, parents=True)<EOL>logger.info("<STR_LIT>")<EOL>git_repo = self._pull(repo_path=repo_path, repo=repo, branch=branch,<EOL>depth=depth,<EOL>reference=reference)<EOL><DEDENT>self.save_hash(repo, branch, git_repo)<EOL>return git_repo, repo_path<EOL>
Either clones the repository if it's not cloned already or pulls from origin.
If ``single_pull`` is enabled, only pulls if the repo/branch combination wasn't pulled again by this instance.

:param repo: Repo URL
:param branch: Branch name
:param depth:  See :meth:`run`
:param reference: See :meth:`run`

:return: A :class:`Repo <git.repo.base.Repo>` instance for the repo
         and a :class:`Path <pathlib.Path>` to the location where the repo is stored.