Как мелко клонировать локальный репозиторий 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 просто не поддерживают относительные пути:
- Схема файла Uri и относительные файлы
- https://superuser.com/questions/210263/file-to-point-a-relative-file-to-current-directory
мерзавец 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