diff --git a/dvc/external_repo.py b/dvc/external_repo.py
index c29863465..cb5f38620 100644
--- a/dvc/external_repo.py
+++ b/dvc/external_repo.py
@@ -46,7 +46,7 @@ def _clone(cache_dir=None, **kwargs):
         repo = Repo(_path)
         cache_config = CacheConfig(repo.config)
         cache_config.set_dir(cache_dir, level=Config.LEVEL_LOCAL)
-        repo.scm.git.close()
+        repo.scm.close()
 
     return Repo(_path)
 
@@ -70,7 +70,7 @@ def _clone_git_repo(to_path, url=None, rev=None, rev_lock=None):
 
 
 def _remove(repo):
-    repo.scm.git.close()
+    repo.scm.close()
 
     if os.name == "nt":
         # git.exe may hang for a while not permitting to remove temp dir
diff --git a/dvc/scm/base.py b/dvc/scm/base.py
index e52fafe99..e7cf61fa5 100644
--- a/dvc/scm/base.py
+++ b/dvc/scm/base.py
@@ -144,3 +144,6 @@ class Base(object):
 
     def belongs_to_scm(self, path):
         """Return boolean whether file belongs to scm"""
+
+    def close(self):
+        """ Method to close the files """
diff --git a/dvc/scm/git/__init__.py b/dvc/scm/git/__init__.py
index 883c75afd..290ca5802 100644
--- a/dvc/scm/git/__init__.py
+++ b/dvc/scm/git/__init__.py
@@ -42,7 +42,7 @@ class Git(Base):
         from git.exc import InvalidGitRepositoryError
 
         try:
-            self.git = git.Repo(self.root_dir)
+            self.repo = git.Repo(self.root_dir)
         except InvalidGitRepositoryError:
             msg = "{} is not a git repository"
             raise SCMError(msg.format(self.root_dir))
@@ -51,7 +51,7 @@ class Git(Base):
         # http://pyinstaller.readthedocs.io/en/stable/runtime-information.html
         env = fix_env(None)
         libpath = env.get("LD_LIBRARY_PATH", None)
-        self.git.git.update_environment(LD_LIBRARY_PATH=libpath)
+        self.repo.git.update_environment(LD_LIBRARY_PATH=libpath)
 
         self.ignored_paths = []
         self.files_to_track = set()
@@ -70,7 +70,7 @@ class Git(Base):
 
     @property
     def dir(self):
-        return self.git.git_dir
+        return self.repo.git_dir
 
     @property
     def ignore_file(self):
@@ -167,7 +167,7 @@ class Git(Base):
         # NOTE: GitPython is not currently able to handle index version >= 3.
         # See https://github.com/iterative/dvc/issues/610 for more details.
         try:
-            self.git.index.add(paths)
+            self.repo.index.add(paths)
         except AssertionError:
             msg = (
                 "failed to add '{}' to git. You can add those files"
@@ -179,41 +179,41 @@ class Git(Base):
             logger.exception(msg)
 
     def commit(self, msg):
-        self.git.index.commit(msg)
+        self.repo.index.commit(msg)
 
     def checkout(self, branch, create_new=False):
         if create_new:
-            self.git.git.checkout("HEAD", b=branch)
+            self.repo.git.checkout("HEAD", b=branch)
         else:
-            self.git.git.checkout(branch)
+            self.repo.git.checkout(branch)
 
     def branch(self, branch):
-        self.git.git.branch(branch)
+        self.repo.git.branch(branch)
 
     def tag(self, tag):
-        self.git.git.tag(tag)
+        self.repo.git.tag(tag)
 
     def untracked_files(self):
-        files = self.git.untracked_files
-        return [os.path.join(self.git.working_dir, fname) for fname in files]
+        files = self.repo.untracked_files
+        return [os.path.join(self.repo.working_dir, fname) for fname in files]
 
     def is_tracked(self, path):
-        # it is equivalent to `bool(self.git.git.ls_files(path))` by
+        # it is equivalent to `bool(self.repo.git.ls_files(path))` by
         # functionality, but ls_files fails on unicode filenames
         path = relpath(path, self.root_dir)
-        return path in [i[0] for i in self.git.index.entries]
+        return path in [i[0] for i in self.repo.index.entries]
 
     def is_dirty(self):
-        return self.git.is_dirty()
+        return self.repo.is_dirty()
 
     def active_branch(self):
-        return self.git.active_branch.name
+        return self.repo.active_branch.name
 
     def list_branches(self):
-        return [h.name for h in self.git.heads]
+        return [h.name for h in self.repo.heads]
 
     def list_tags(self):
-        return [t.name for t in self.git.tags]
+        return [t.name for t in self.repo.tags]
 
     def _install_hook(self, name, cmd):
         command = '[ -z "$(git ls-files .dvc)" ] || exec dvc {}'.format(cmd)
@@ -266,7 +266,7 @@ class Git(Base):
         return basename == self.ignore_file or Git.GIT_DIR in path_parts
 
     def get_tree(self, rev):
-        return GitTree(self.git, rev)
+        return GitTree(self.repo, rev)
 
     def _get_diff_trees(self, a_ref, b_ref):
         """Private method for getting the trees and commit hashes of 2 git
@@ -284,10 +284,10 @@ class Git(Base):
         trees = {DIFF_A_TREE: None, DIFF_B_TREE: None}
         commits = []
         if b_ref is None:
-            b_ref = self.git.head.commit
+            b_ref = self.repo.head.commit
         try:
-            a_commit = self.git.git.rev_parse(a_ref, short=True)
-            b_commit = self.git.git.rev_parse(b_ref, short=True)
+            a_commit = self.repo.git.rev_parse(a_ref, short=True)
+            b_commit = self.repo.git.rev_parse(b_ref, short=True)
             # See https://gitpython.readthedocs.io
             # /en/2.1.11/reference.html#git.objects.base.Object.__str__
             commits.append(a_commit)
@@ -322,4 +322,7 @@ class Git(Base):
         return diff_dct
 
     def get_rev(self):
-        return self.git.git.rev_parse("HEAD")
+        return self.repo.git.rev_parse("HEAD")
+
+    def close(self):
+        self.repo.close()

rename `git` property (a Repo object) in class `dvc.scm.Git`?
`class Git(Base)` property [`self.git`](https://github.com/iterative/dvc/blob/master/dvc/scm/git/__init__.py#L45), while named `git`, is not a **Git** object but rather a **Repo** object, which comes with a `git` property itself (which is the actual Git object); So using the latter (which we do a lot in tests) makes the code a little confusing, like: `self.git.git` and `dvc.scm.git.git`.
> It could even be `self.git.git.git` [in `class GitTree`](https://github.com/iterative/dvc/blob/master/dvc/scm/git/tree.py#L25)!

I think ideally the property name should be `self.repo`, except that name its already in use [by `class Base`](https://github.com/iterative/dvc/blob/master/dvc/scm/base.py#L35) (parent of `class Git`) so renaming `dvc.scm.Git.git` to `dvc.scm.Git.repo` would overwrite `dvc.scm.Base.repo`. I don't know whether this is an immediate problem since I don't see the current `dvc.scm.Git.repo` property being used anywhere in the code, but we probably want to avoid that overwrite anyway.

The options I see are:
a) Don't mind the overwrite and just rename `dvc.scm.Git.git` to `dvc.scm.Git.repo`
b) Rename `dvc.scm.Base.repo` to something else (e.g. `dvc.scm.Base._repo`) and then rename `dvc.scm.Git.git` to `dvc.scm.Git.repo`
c) Rename `dvc.scm.Git.git` to something else, e.g. `dvc.scm.Git.repository`
diff --git a/tests/basic_env.py b/tests/basic_env.py
index 5de08bc0f..5afba2c3c 100644
--- a/tests/basic_env.py
+++ b/tests/basic_env.py
@@ -166,7 +166,7 @@ class TestDvcGitFixture(TestGitFixture):
         self.dvc.scm.commit("init dvc")
 
     def tearDown(self):
-        self.dvc.scm.git.close()
+        self.dvc.scm.close()
         super(TestDvcGitFixture, self).tearDown()
 
 
diff --git a/tests/conftest.py b/tests/conftest.py
index 8010ff18f..3356a4a0b 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -162,7 +162,7 @@ def erepo(repo_dir):
 
         repo.dvc.scm.checkout("master")
 
-        repo.dvc.scm.git.close()
+        repo.dvc.scm.close()
         repo.git.close()
 
         os.chdir(repo._saved_dir)
diff --git a/tests/func/test_diff.py b/tests/func/test_diff.py
index f4b148cfa..92910a3d0 100644
--- a/tests/func/test_diff.py
+++ b/tests/func/test_diff.py
@@ -96,7 +96,7 @@ class TestDiffDir(TestDvcGit):
         self.git.index.add([self.DATA_DIR + ".dvc"])
         self.git.index.commit("adds data_dir")
         self.a_ref = self.git.git.rev_parse(
-            self.dvc.scm.git.head.commit, short=True
+            self.dvc.scm.repo.head.commit, short=True
         )
         self.old_checksum = _get_checksum(self.dvc, self.DATA_DIR)
         self.new_file = os.path.join(self.DATA_SUB_DIR, diff.DIFF_NEW_FILE)
@@ -154,7 +154,7 @@ class TestDiffDirRepoDeletedFile(TestDiffDir):
 
         self.b_ref = self.a_ref
         self.new_checksum = self.old_checksum
-        self.a_ref = str(self.dvc.scm.git.head.commit)
+        self.a_ref = str(self.dvc.scm.repo.head.commit)
         self.old_checksum = _get_checksum(self.dvc, self.DATA_DIR)
 
     def test(self):
diff --git a/tests/func/test_install.py b/tests/func/test_install.py
index 1e3c7b8ba..140e0b5d5 100644
--- a/tests/func/test_install.py
+++ b/tests/func/test_install.py
@@ -88,12 +88,12 @@ class TestInstall(object):
         assert ret == 0
 
         stage_file = repo_dir.FOO + Stage.STAGE_FILE_SUFFIX
-        dvc_repo.scm.git.index.add([stage_file, ".gitignore"])
-        dvc_repo.scm.git.index.commit("commit message")
+        dvc_repo.scm.repo.index.add([stage_file, ".gitignore"])
+        dvc_repo.scm.repo.index.commit("commit message")
 
-        dvc_repo.scm.git.clone(git_remote)
-        dvc_repo.scm.git.create_remote("origin", git_remote)
+        dvc_repo.scm.repo.clone(git_remote)
+        dvc_repo.scm.repo.create_remote("origin", git_remote)
 
-        dvc_repo.scm.git.git.push("origin", "master")
+        dvc_repo.scm.repo.git.push("origin", "master")
 
         assert os.path.isfile(expected_cache_path)
diff --git a/tests/func/test_metrics.py b/tests/func/test_metrics.py
index 4159c6461..e7892f506 100644
--- a/tests/func/test_metrics.py
+++ b/tests/func/test_metrics.py
@@ -22,7 +22,7 @@ class TestMetricsBase(TestDvcGit):
         branches = ["foo", "bar", "baz"]
 
         for branch in branches:
-            self.dvc.scm.git.create_head(branch)
+            self.dvc.scm.repo.create_head(branch)
 
         for branch in branches:
             self.dvc.scm.checkout(branch)
@@ -692,7 +692,7 @@ class TestCachedMetrics(TestDvcGit):
 
         # TestDvc currently is based on TestGit, so it is safe to use
         # scm.git for now
-        self.dvc.scm.git.git.clean("-fd")
+        self.dvc.scm.repo.git.clean("-fd")
 
         self.dvc = DvcRepo(".")
 
diff --git a/tests/func/test_repo.py b/tests/func/test_repo.py
index 8da5082dd..8184721c6 100644
--- a/tests/func/test_repo.py
+++ b/tests/func/test_repo.py
@@ -31,7 +31,7 @@ class TestCollect(TestDvcGit):
 
     def _check(self, branch, target, with_deps, expected):
         if branch:
-            self.dvc.tree = GitTree(self.dvc.scm.git, branch)
+            self.dvc.tree = GitTree(self.dvc.scm.repo, branch)
         else:
             self.dvc.tree = WorkingTree()
         result = self.dvc.collect(target + ".dvc", with_deps=with_deps)
diff --git a/tests/func/test_scm.py b/tests/func/test_scm.py
index 8135f6606..ada5b4759 100644
--- a/tests/func/test_scm.py
+++ b/tests/func/test_scm.py
@@ -42,7 +42,7 @@ class TestSCMGit(TestGit):
         G.commit("add")
         self.assertTrue(G.is_tracked(foo))
         self.assertTrue(G.is_tracked(self.FOO))
-        G.git.index.remove([self.FOO], working_tree=True)
+        G.repo.index.remove([self.FOO], working_tree=True)
         self.assertFalse(G.is_tracked(foo))
         self.assertFalse(G.is_tracked(self.FOO))
         self.assertFalse(G.is_tracked("not-existing-file"))
diff --git a/tests/func/test_update.py b/tests/func/test_update.py
index 7345627aa..454501504 100644
--- a/tests/func/test_update.py
+++ b/tests/func/test_update.py
@@ -30,7 +30,7 @@ def test_update_import(dvc_repo, erepo):
     repo.scm.commit("updated")
     repo.scm.checkout("master")
 
-    repo.scm.git.close()
+    repo.scm.close()
 
     os.chdir(saved_dir)
 

pip install -e .[all]
parse_log_pytest
pytest
pytest pytest-timeout pytest-cov pytest-xdist pytest-mock flaky mock xmltodict awscli google-compute-engine Pygments collective.checkdocs flake8 psutil flake8-docstrings pydocstyle jaraco.windows mock-ssh-server moto rangehttpserver
apt-get update apt-get install -y gcc
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
aliyun-python-sdk-core==2.16.0
aliyun-python-sdk-core-v3==2.13.33
aliyun-python-sdk-kms==2.16.5
appdirs==1.4.4
asciimatics==1.14.0
attrs @ file:///croot/attrs_1668696182826/work
autocommand==2.2.2
awscli==1.31.13
azure-common==1.1.28
azure-storage-blob==2.0.1
azure-storage-common==2.1.0
bcrypt==4.2.1
boto==2.49.0
boto3==1.9.115
botocore==1.12.253
cachetools==5.5.2
certifi @ file:///croot/certifi_1671487769961/work/certifi
cffi==1.15.1
charset-normalizer==3.4.1
collective.checkdocs==0.2
colorama==0.4.4
configobj==5.0.9
configparser==5.3.0
coverage==7.2.7
crcmod==1.7
cryptography==44.0.2
distro==1.9.0
docutils==0.15.2
-e git+https://github.com/iterative/dvc.git@c5c248c098b43882f246b7678a2538d287343ba1#egg=dvc
execnet==2.0.2
flake8==5.0.4
flake8-docstrings==1.7.0
flaky==3.8.1
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
funcy==2.0
future==1.0.0
gitdb==4.0.12
GitPython==3.1.44
google-api-core==1.34.1
google-auth==2.38.0
google-cloud-core==0.28.1
google-cloud-storage==1.13.0
google-compute-engine==2.8.13
google-crc32c==1.5.0
google-resumable-media==2.7.2
googleapis-common-protos==1.69.2
grandalf==0.6
humanize==4.6.0
idna==3.10
importlib-metadata==4.2.0
importlib-resources==5.12.0
inflect==6.0.5
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
jaraco.classes==3.2.3
jaraco.collections==4.2.0
jaraco.context==4.3.0
jaraco.functools==3.7.0
jaraco.structures==2.1.0
jaraco.text==3.11.1
jaraco.ui==2.3.0
jaraco.windows==5.7.0
Jinja2==3.1.6
jmespath==0.10.0
jsonpath-ng==1.7.0
MarkupSafe==2.1.5
mccabe==0.7.0
mock==5.2.0
mock-ssh-server==0.9.1
more-itertools==9.1.0
moto==4.2.14
nanotime==0.5.2
networkx==2.6.3
numpy==1.21.6
oss2==2.6.1
packaging @ file:///croot/packaging_1671697413597/work
paramiko==3.5.1
path==16.6.0
pathspec==0.11.2
Pillow==9.5.0
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
ply==3.11
protobuf==3.20.3
psutil==7.0.0
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyarrow==0.14.0
pyasn1==0.5.1
pyasn1-modules==0.3.0
pycodestyle==2.9.1
pycparser==2.21
pycryptodome==3.22.0
pydantic==1.10.21
pydocstyle==6.3.0
pyfiglet==0.8.post1
pyflakes==2.5.0
Pygments==2.17.2
PyNaCl==1.5.0
pyparsing==3.1.4
pytest==7.1.2
pytest-cov==4.1.0
pytest-mock==3.11.1
pytest-timeout==2.3.1
pytest-xdist==3.5.0
python-dateutil==2.9.0.post0
PyYAML==6.0.1
rangehttpserver==1.4.0
requests==2.31.0
responses==0.23.3
rsa==4.7.2
ruamel.yaml==0.15.100
s3transfer==0.2.1
schema==0.7.7
shortuuid==1.0.13
six==1.17.0
smmap==5.0.2
snowballstemmer==2.2.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
treelib==1.7.1
types-PyYAML==6.0.12.12
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
urllib3==1.25.11
wcwidth==0.2.13
Werkzeug==2.2.3
xmltodict==0.14.2
zc.lockfile==3.0.post1
zipp @ file:///croot/zipp_1672387121353/work

name: dvc
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - aliyun-python-sdk-core==2.16.0
      - aliyun-python-sdk-core-v3==2.13.33
      - aliyun-python-sdk-kms==2.16.5
      - appdirs==1.4.4
      - asciimatics==1.14.0
      - autocommand==2.2.2
      - awscli==1.31.13
      - azure-common==1.1.28
      - azure-storage-blob==2.0.1
      - azure-storage-common==2.1.0
      - bcrypt==4.2.1
      - boto==2.49.0
      - boto3==1.9.115
      - botocore==1.12.253
      - cachetools==5.5.2
      - cffi==1.15.1
      - charset-normalizer==3.4.1
      - collective-checkdocs==0.2
      - colorama==0.4.4
      - configobj==5.0.9
      - configparser==5.3.0
      - coverage==7.2.7
      - crcmod==1.7
      - cryptography==44.0.2
      - distro==1.9.0
      - docutils==0.15.2
      - dvc==0.53.2
      - execnet==2.0.2
      - flake8==5.0.4
      - flake8-docstrings==1.7.0
      - flaky==3.8.1
      - funcy==2.0
      - future==1.0.0
      - gitdb==4.0.12
      - gitpython==3.1.44
      - google-api-core==1.34.1
      - google-auth==2.38.0
      - google-cloud-core==0.28.1
      - google-cloud-storage==1.13.0
      - google-compute-engine==2.8.13
      - google-crc32c==1.5.0
      - google-resumable-media==2.7.2
      - googleapis-common-protos==1.69.2
      - grandalf==0.6
      - humanize==4.6.0
      - idna==3.10
      - importlib-metadata==4.2.0
      - importlib-resources==5.12.0
      - inflect==6.0.5
      - jaraco-classes==3.2.3
      - jaraco-collections==4.2.0
      - jaraco-context==4.3.0
      - jaraco-functools==3.7.0
      - jaraco-structures==2.1.0
      - jaraco-text==3.11.1
      - jaraco-ui==2.3.0
      - jaraco-windows==5.7.0
      - jinja2==3.1.6
      - jmespath==0.10.0
      - jsonpath-ng==1.7.0
      - markupsafe==2.1.5
      - mccabe==0.7.0
      - mock==5.2.0
      - mock-ssh-server==0.9.1
      - more-itertools==9.1.0
      - moto==4.2.14
      - nanotime==0.5.2
      - networkx==2.6.3
      - numpy==1.21.6
      - oss2==2.6.1
      - paramiko==3.5.1
      - path==16.6.0
      - pathspec==0.11.2
      - pillow==9.5.0
      - ply==3.11
      - protobuf==3.20.3
      - psutil==7.0.0
      - pyarrow==0.14.0
      - pyasn1==0.5.1
      - pyasn1-modules==0.3.0
      - pycodestyle==2.9.1
      - pycparser==2.21
      - pycryptodome==3.22.0
      - pydantic==1.10.21
      - pydocstyle==6.3.0
      - pyfiglet==0.8.post1
      - pyflakes==2.5.0
      - pygments==2.17.2
      - pynacl==1.5.0
      - pyparsing==3.1.4
      - pytest-cov==4.1.0
      - pytest-mock==3.11.1
      - pytest-timeout==2.3.1
      - pytest-xdist==3.5.0
      - python-dateutil==2.9.0.post0
      - pyyaml==6.0.1
      - rangehttpserver==1.4.0
      - requests==2.31.0
      - responses==0.23.3
      - rsa==4.7.2
      - ruamel-yaml==0.15.100
      - s3transfer==0.2.1
      - schema==0.7.7
      - shortuuid==1.0.13
      - six==1.17.0
      - smmap==5.0.2
      - snowballstemmer==2.2.0
      - treelib==1.7.1
      - types-pyyaml==6.0.12.12
      - urllib3==1.25.11
      - wcwidth==0.2.13
      - werkzeug==2.2.3
      - xmltodict==0.14.2
      - zc-lockfile==3.0.post1
prefix: /opt/conda/envs/dvc

tests/func/test_diff.py::TestDiff::test tests/func/test_diff.py::TestDiffRepo::test tests/func/test_diff.py::TestDiffCmdLine::test tests/func/test_diff.py::TestDiffCmdMessage::test tests/func/test_diff.py::TestDiffDir::test tests/func/test_diff.py::TestDiffDirRepo::test tests/func/test_diff.py::TestDiffDirRepoDeletedFile::test tests/func/test_diff.py::TestDiffFileNotFound::test tests/func/test_install.py::TestInstall::test_should_pre_push_hook_push tests/func/test_metrics.py::TestMetrics::test_formatted_output tests/func/test_metrics.py::TestMetrics::test_show tests/func/test_metrics.py::TestMetrics::test_show_all_should_be_current_dir_agnostic tests/func/test_metrics.py::TestMetrics::test_type_case_normalized tests/func/test_metrics.py::TestMetrics::test_unknown_type_ignored tests/func/test_metrics.py::TestMetrics::test_xpath_all tests/func/test_metrics.py::TestMetrics::test_xpath_all_columns tests/func/test_metrics.py::TestMetrics::test_xpath_all_rows tests/func/test_metrics.py::TestMetrics::test_xpath_all_with_header tests/func/test_metrics.py::TestMetrics::test_xpath_is_empty tests/func/test_metrics.py::TestMetrics::test_xpath_is_none tests/func/test_metrics.py::TestMetricsRecursive::test tests/func/test_metrics.py::TestMetricsReproCLI::test tests/func/test_metrics.py::TestMetricsReproCLI::test_binary tests/func/test_metrics.py::TestMetricsReproCLI::test_dir tests/func/test_metrics.py::TestMetricsCLI::test tests/func/test_metrics.py::TestMetricsCLI::test_binary tests/func/test_metrics.py::TestMetricsCLI::test_dir tests/func/test_metrics.py::TestMetricsCLI::test_non_existing tests/func/test_metrics.py::TestMetricsCLI::test_wrong_type_add tests/func/test_metrics.py::TestMetricsCLI::test_wrong_type_modify tests/func/test_metrics.py::TestMetricsCLI::test_wrong_type_show tests/func/test_metrics.py::TestNoMetrics::test tests/func/test_metrics.py::TestNoMetrics::test_cli tests/func/test_metrics.py::TestCachedMetrics::test_add tests/func/test_metrics.py::TestCachedMetrics::test_run tests/func/test_metrics.py::TestMetricsType::test_show tests/func/test_repo.py::TestIgnore::test_should_not_gather_stage_files_from_ignored_dir tests/func/test_scm.py::TestSCMGit::test_is_tracked tests/func/test_update.py::test_update_import
tests/func/test_repo.py::TestCollect::test
tests/func/test_install.py::TestInstall::test_should_create_hooks tests/func/test_install.py::TestInstall::test_should_append_hooks_if_file_already_exists tests/func/test_install.py::TestInstall::test_should_be_idempotent tests/func/test_install.py::TestInstall::test_should_post_checkout_hook_checkout tests/func/test_metrics.py::TestShouldDisplayMetricsEvenIfMetricIsMissing::test tests/func/test_metrics.py::test_show_xpath_should_override_stage_xpath tests/func/test_scm.py::TestSCM::test_git tests/func/test_scm.py::TestSCM::test_none tests/func/test_scm.py::TestSCMGit::test_commit tests/func/test_scm.py::TestSCMGit::test_is_repo tests/func/test_scm.py::TestSCMGitSubmodule::test_commit_in_submodule tests/func/test_scm.py::TestSCMGitSubmodule::test_git_submodule tests/func/test_scm.py::TestSCMGitSubmodule::test_is_submodule tests/func/test_scm.py::TestIgnore::test_ignore tests/func/test_scm.py::TestIgnore::test_get_gitignore tests/func/test_scm.py::TestIgnore::test_get_gitignore_subdir tests/func/test_scm.py::TestIgnore::test_get_gitignore_ignorefile_dir tests/func/test_scm.py::TestIgnore::test_get_gitignore_ignorefile_dir_upper_level tests/func/test_scm.py::TestIgnore::test_gitignore_should_end_with_newline tests/func/test_scm.py::TestIgnore::test_gitignore_should_append_newline_to_gitignore tests/func/test_update.py::test_update_import_url
dvc/external_repo.py dvc/scm/base.py dvc/scm/git/__init__.py
dvc/external_repo.py dvc/scm/base.py dvc/scm/git/__init__.py