如何使用相对路径浅层克隆本地git存储库?

时间:2017-11-15 12:34:10

标签: git

本地目录的浅克隆需要file://,如:git clone: warning: --depth is ignored in local clones; use file:// instead

所述

但是如何使用相对路径?

例如:如果我在当前目录中有一个回购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根本不支持相对路径:

git 2.14.1。

3 个答案:

答案 0 :(得分: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以及对象和refs目录下的所有内容来克隆存储库。尽可能将.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 SSD的接收速度为10.81 MiB / s)

使用--local标志进行克隆要快得多:

$ 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

答案 1 :(得分:0)

  

但是如何使用相对路径呢?

不支持此功能; file://仅期望绝对路径。有例如RFC1738RFC8089描述了这种URI。

  

文件URL的格式为:

   file://<host>/<path>
     

其中是系统上的标准域名
  可以访问,并且是分层的
  //.../.

形式的目录路径

file://mymodule时,mymodule可以解释为主机名。

答案 2 :(得分:-1)

您应该尝试不使用file://前缀:

git clone --depth 1 ./mymodule mymodule2