Как мелко клонировать локальный репозиторий git с относительным путем?

Мелкие клоны локальных каталогов требуют file:// как объяснено в: git clone: ​​warning: --depth игнорируется в локальных клонах; вместо этого используйте file: //

Но как использовать относительные пути с этим?

Например, если у меня есть репо myrepo в текущем каталоге, а затем я делаю:

git clone --depth 1 file://mymodule mymodule2

тогда это терпит неудачу с:

Cloning into 'mymodule2'...
fatal: No path specified. See 'man git-pull' for valid url syntax

И если я попробую:

git clone --depth 1 file://./mymodule mymodule2

Это терпит неудачу с:

Cloning into 'mymodule2'...
fatal: '/./mymodule' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Единственный обходной путь, который я смог найти, - это преобразовать его в абсолютный путь, начинающийся с /:

git clone --depth 1 "file://$(pwd)/mymodule" mymodule2

Есть ли глубокая причина для такого поведения, или он просто глючит?

Может быть, файловые URI просто не поддерживают относительные пути:

мерзавец 2.14.1.

0 ответов

Мелкое клонирование локального репо не является ни необходимым, ни полезным. Простоgit clone ./relative/path и вам хорошо идти.

Я предполагаю, что вы хотите неглубокое копирование, потому что вы хотите сэкономить место на диске и сэкономить время, но

1. Это не экономит место на диске при локальном клонировании.

Из руководства Git 2.24.1:

Для локальных репозиториев, которые также изначально поддерживаются Git, можно использовать следующие синтаксисы:

• /path/to/repo.git/

â € file:///path/to/repo.git/

Эти два синтаксиса в основном эквивалентны, за исключением того, что первый подразумевает параметр --local.

а также

-l, --local

Когда репозиторий для клонирования находится на локальном компьютере, этот флаг обходит обычный транспортный механизм "с учетом Git" и клонирует репозиторий, создавая копию HEAD и всего, что находится в каталогах объектов и ссылок. Файлы в каталоге.git / objects / жестко связаны для экономии места, когда это возможно.

Так что неглубокая копия с file:///path/to/repo.git/ синтаксис должен занимать больше места на диске, чем полная копия с /path/to/repo.git/ синтаксис, потому что в первом есть реальные копии объектов вместо жестких ссылок.

(И я считаю, что именно жесткие ссылки являются причиной того, что --depth игнорировать, когда --local установлено.)

2. Это тоже не экономит время.

Тем не менее, руководство по Git 2.24.1:

-l, --local

Когда репозиторий для клонирования находится на локальном компьютере, этот флаг обходит обычный транспортный механизм "с учетом Git" и клонирует репозиторий путем создания копии HEAD и всего, что находится в каталогах объектов и ссылок. Файлы в каталоге.git / objects / жестко связаны для экономии места, когда это возможно.

Транспортный механизм с поддержкой Git требует много времени, даже если URI file://... потому что он включает сжатие объекта:

$ time git clone --depth 1 --local --shallow-submodules file://$(pwd)/../linux
Cloning into 'linux'...
warning: --local is ignored
remote: Enumerating objects: 65607, done.
remote: Counting objects: 100% (65607/65607), done.
remote: Compressing objects: 100% (61137/61137), done.
remote: Total 65607 (delta 4886), reused 39965 (delta 3556)
Receiving objects: 100% (65607/65607), 176.65 MiB | 10.81 MiB/s, done.
Resolving deltas: 100% (4886/4886), done.
Updating files: 100% (61793/61793), done.
git clone --depth 1 --local --shallow-submodules  73.55s user 4.97s system 245% cpu 31.976 total

(Я не знаю, почему на моем твердотельном накопителе NVMe скорость приема составляет 10,81 МБ / с)

И клонирование с помощью --local flag намного быстрее:

$ time git clone ../linux
Cloning into 'linux'...
done.
Updating files: 100% (61793/61793), done.
git clone ../linux  4.16s user 1.71s system 100% cpu 5.857 total

Но как с этим использовать относительные пути?

Это не поддерживается; file://ожидает только абсолютных путей. Например, RFC1738 и RFC8089 описывают этот тип URI.

URL-адрес файла имеет вид:

   file://<host>/<path>

где - полное доменное имя системы, в
которой доступен, и - иерархический
путь к каталогу в форме //.../.

Когда ты пишешь file://mymodule, то mymodule можно интерпретировать как имя хоста.

Вы должны попробовать без file:// префикс:

git clone --depth 1 ./mymodule mymodule2
Другие вопросы по тегам