#11065·dvc

dvc list: fails with ssh when using dulwich >= 1.2.8

Author: frederiksteinerSBBCreated Jul 10, 2026Updated Jul 10, 2026

Bug Report

Description

When running the command poetry run dvc list ssh://some-repo data/some-dataset -R -v dvc gets stuck at cloning the repository.

When running GIT_SSH_COMMAND="ssh -o BatchMode=yes -o StrictHostKeyChecking=yes" poetry run dvc list ssh://some-repo data/some-dataset -R -v we get the following error:

2026-07-10 10:52:20,059 DEBUG: v3.67.1 (pip), CPython 3.12.12 on Linux-4.18.0-553.22.1.el8_10.x86_64-x86_64-with-glibc2.28
2026-07-10 10:52:20,059 DEBUG: command: /some_path/.venv/bin/dvc list ssh://some-repo some-dataset -R -v
2026-07-10 10:52:20,281 DEBUG: Creating external repo ssh://some-repo@None
2026-07-10 10:52:20,281 DEBUG: erepo: git clone 'ssh://some-repo' to a temporary dir
2026-07-10 10:52:20,837 ERROR: failed to list 'ssh://some-repo' - SCM error: Failed to clone repo 'ssh://some-repo' to '/tmp/tmp2g0qc5madvc-clone': The remote server unexpectedly closed the connection.
Traceback (most recent call last):
  File "/some_path/.venv/lib/python3.12/site-packages/scmrepo/git/backend/dulwich/__init__.py", line 261, in clone
    repo = clone_from()
           ^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dulwich/porcelain/__init__.py", line 1593, in clone
    repo = client.clone(
           ^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dulwich/client.py", line 1528, in clone
    result = self.fetch(
             ^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dulwich/client.py", line 1671, in fetch
    result = self.fetch_pack(
             ^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dulwich/client.py", line 2217, in fetch_pack
    server_protocol_version = negotiate_protocol_version(proto)
                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dulwich/client.py", line 412, in negotiate_protocol_version
    pkt = proto.read_pkt_line()
          ^^^^^^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dulwich/protocol.py", line 493, in read_pkt_line
    raise HangupException
dulwich.errors.HangupException: The remote server unexpectedly closed the connection.

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/some_path/.venv/lib/python3.12/site-packages/dvc/scm.py", line 153, in clone
    git = Git.clone(url, to_path, progress=pbar.update_git, **kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/scmrepo/git/__init__.py", line 156, in clone
    backend.clone(url, to_path, bare=bare, mirror=mirror, **kwargs)
  File "/some_path/.venv/lib/python3.12/site-packages/scmrepo/git/backend/dulwich/__init__.py", line 269, in clone
    raise CloneError(url, os.fsdecode(to_path)) from exc
scmrepo.exceptions.CloneError: Failed to clone repo 'ssh://some-repo' to '/tmp/tmp2g0qc5madvc-clone'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/some_path/.venv/lib/python3.12/site-packages/dvc/commands/ls/__init__.py", line 177, in run
    return self._show_list()
           ^^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dvc/commands/ls/__init__.py", line 148, in _show_list
    entries = Repo.ls(
              ^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dvc/repo/ls.py", line 81, in ls
    with _open_repo(url, rev, config, remote, remote_config) as repo:
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dvc/repo/ls.py", line 24, in _open_repo
    return Repo.open(
           ^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dvc/repo/__init__.py", line 306, in open
    return open_repo(url, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dvc/repo/open_repo.py", line 60, in open_repo
    return _external_repo(url, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ldap/u237427/.pyenv/versions/3.12.12/lib/python3.12/contextlib.py", line 81, in inner
    return func(*args, **kwds)
           ^^^^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dvc/repo/open_repo.py", line 23, in _external_repo
    path = _cached_clone(url, rev)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dvc/repo/open_repo.py", line 140, in _cached_clone
    clone_path, shallow = _clone_default_branch(url, rev)
                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/funcy/decorators.py", line 47, in wrapper
    return deco(call, *dargs, **dkwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/funcy/flow.py", line 246, in wrap_with
    return call()
           ^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/funcy/decorators.py", line 68, in __call__
    return self._func(*self._args, **self._kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dvc/repo/open_repo.py", line 204, in _clone_default_branch
    git = clone(url, clone_path)
          ^^^^^^^^^^^^^^^^^^^^^^
  File "/some_path/.venv/lib/python3.12/site-packages/dvc/scm.py", line 158, in clone
    raise CloneError("SCM error") from exc
dvc.scm.CloneError: SCM error

2026-07-10 10:52:20,857 DEBUG: Analytics is enabled.
2026-07-10 10:52:20,904 DEBUG: Trying to spawn ['daemon', 'analytics', '/tmp/tmpp4p7z2pb', '-v']
2026-07-10 10:52:20,911 DEBUG: Spawned ['daemon', 'analytics', '/tmp/tmpp4p7z2pb', '-v'] with pid 3373789

When downgrading dulwich to a version below 1.2.8, it works

Reproduce

  1. create the following pyproject repo:
#----------------- pyproject.toml--------------------------------:
[tool.poetry]
name = "dummy-project"
version = "0.0.0" # Version is ignored and set jenkins. Use pipeline to increase.
description = ""

[tool.poetry.dependencies]
python = "~3.13"

[tool.poetry.group.dvc]
optional = true

[tool.poetry.group.dvc.dependencies]
dvc = { extras = ["azure"], version = "3.67.1" }

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
  1. Run poetry lock
  2. Run poetry install --with dvc --no-root
  3. Run poetry run dvc list ssh://git@some-repo data/some-dataset -R -v and GIT_SSH_COMMAND="ssh" poetry run dvc list ssh://git@some-repo data/some-dataset -R -v

Expected

I expect there to be no error showing with the second command and with the first command it should not stay stuck at cloning

Environment information

Output of dvc doctor:

bash
$ dvc doctor

DVC version: 3.67.1 (pip)
-------------------------
Platform: Python 3.13.3 on Linux-6.18.33.2-microsoft-standard-WSL2-x86_64-with-glibc2.35
Subprojects:
        dvc_data = 3.18.3
        dvc_objects = 5.2.0
        dvc_render = 1.0.2
        dvc_task = 0.40.2
        scmrepo = 3.6.2
Supports:
        azure (adlfs = 2026.5.0, knack = 0.14.0, azure-identity = 1.25.3),
        http (aiohttp = 3.14.1, aiohttp-retry = 2.9.1),
        https (aiohttp = 3.14.1, aiohttp-retry = 2.9.1)
Config:
        Global: /home/u237427/.config/dvc
        System: /etc/xdg/dvc

Additional Information (if any):

This commit here could be a possible issue: https://github.com/jelmer/dulwich/pull/2254