From c6b4874025dad2d383a63c0f202fb51577d91172 Mon Sep 17 00:00:00 2001 From: gnought <1684105+gnought@users.noreply.github.com> Date: Sat, 7 Feb 2026 00:42:58 +0800 Subject: [PATCH] fetch tag pointing to HEAD in shallow clone --- pre_commit/store.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/pre_commit/store.py b/pre_commit/store.py index dc90c051..e4a841bb 100644 --- a/pre_commit/store.py +++ b/pre_commit/store.py @@ -15,7 +15,7 @@ from pre_commit import file_lock from pre_commit import git from pre_commit.util import CalledProcessError from pre_commit.util import clean_path_on_failure -from pre_commit.util import cmd_output_b +from pre_commit.util import cmd_output from pre_commit.util import resource_text @@ -174,19 +174,32 @@ class Store: return directory - def _complete_clone(self, ref: str, git_cmd: Callable[..., None]) -> None: + def _complete_clone( + self, ref: str, + git_cmd: Callable[..., tuple[int, str, str | None]], + ) -> None: """Perform a complete clone of a repository and its submodules """ git_cmd('fetch', 'origin', '--tags') git_cmd('checkout', ref) git_cmd('submodule', 'update', '--init', '--recursive') - def _shallow_clone(self, ref: str, git_cmd: Callable[..., None]) -> None: + def _shallow_clone( + self, ref: str, + git_cmd: Callable[..., tuple[int, str, str | None]], + ) -> None: """Perform a shallow clone of a repository and its submodules """ git_config = 'protocol.version=2' git_cmd('-c', git_config, 'fetch', 'origin', ref, '--depth=1') git_cmd('checkout', 'FETCH_HEAD') + rev = git_cmd('rev-parse', 'FETCH_HEAD')[1].strip() + lines = git_cmd('ls-remote', '--heads', 'origin')[1].splitlines() + for line in lines: + if line.startswith(rev): + tag_name = line.rsplit('/', 1)[-1] + git_cmd('fetch', 'origin', 'tag', tag_name, '--no-tags') + break git_cmd( '-c', git_config, 'submodule', 'update', '--init', '--recursive', '--depth=1', @@ -199,8 +212,8 @@ class Store: git.init_repo(directory, repo) env = git.no_git_env() - def _git_cmd(*args: str) -> None: - cmd_output_b('git', *args, cwd=directory, env=env) + def _git_cmd(*args: str) -> tuple[int, str, str | None]: + return cmd_output('git', *args, cwd=directory, env=env) try: self._shallow_clone(ref, _git_cmd)