Windows 目标为网络驱动器时git克隆失败

Windows 目标为网络驱动器时git克隆失败,windows,git,networking,Windows,Git,Networking,在MINGW32 shell中使用git在Windows上克隆git存储库时遇到问题。基本症状是,当目标位于本地磁盘上时,克隆此特定存储库可以正常工作,但当克隆目标位于网络驱动器上时,相同的命令失败。以下是本地克隆命令(修改了repo名称): 我还尝试通过添加git clone-c transfer.fsckObjects=1让git验证对象,但这并没有改变症状 正如前面提到的,这个问题似乎是特定于存储库的。以下是一些其他数据点: 代码托管服务器(它与目前提到的所有其他机器是分开的)有许多存储

在MINGW32 shell中使用git在Windows上克隆git存储库时遇到问题。基本症状是,当目标位于本地磁盘上时,克隆此特定存储库可以正常工作,但当克隆目标位于网络驱动器上时,相同的命令失败。以下是本地克隆命令(修改了repo名称):

我还尝试通过添加
git clone-c transfer.fsckObjects=1
让git验证对象,但这并没有改变症状

正如前面提到的,这个问题似乎是特定于存储库的。以下是一些其他数据点:

  • 代码托管服务器(它与目前提到的所有其他机器是分开的)有许多存储库,我已经将其他几个存储库克隆到了网络上,没有任何问题
  • 无论是制作常规克隆还是裸克隆,都会出现此问题
  • 导致失败的对象似乎没有任何特殊之处(压缩大小为中间-727字节)
  • 如果我在git解包时连接ProcMon并断开连接,进程仍然会失败,通常是在另一个对象上
  • 根据目的地的位置,同事也会经历相同的成功/失败模式
  • 如果从本地目录执行git,并将目标目录指定为UNC路径,则该过程仍然失败
以下是我本地机器上的一些重要数据:

$ systeminfo
<snip>
OS Name:                   Microsoft Windows 8.1 Pro
OS Version:                6.3.9600 N/A Build 9600
<snip>
$ uname -a
MINGW32_NT-6.3-WOW LT-DR 2.5.0(0.295/5/3) 2016-03-31 18:26 i686 Msys
$ git --version
git version 2.8.3.windows.1
$systeminfo
操作系统名称:Microsoft Windows 8.1 Pro
操作系统版本:6.3.9600不适用于内部版本9600
$uname-a
MINGW32_NT-6.3-WOW LT-DR 2.5.0(0.295/5/3)2016-03-31 18:26 i686 Msys
$git—版本
git版本2.8.3.windows.1

托管有问题的目标目录的服务器运行Windows server 2008。代码服务器正在运行gitlab ce 8.9.3。

这就是“promissor remote的概念

这个概念与
transfer.fsckobjects
配置一起使用:它告诉“
git fetch
”验证接收包中对象的数据和连接状态;执行此检查的代码已被告知有关狭义克隆的约定,即缺少可从来自promissor remote的包中的对象访问的对象是正常的

在Git2.29(2020年第4季度)之前,当使用promissor remote将许多对象打包到存储库中时,一个接一个地从promissor remote惰性地获取丢失的对象可能效率低下

代码现在尝试批量获取所有缺失的对象(显然,对于懒惰地获取树对象的懒惰克隆来说,这不起作用,因为在了解哪些树缺失之前,您甚至无法枚举缺失的blob)

这可能有助于从网络驱动器进行git克隆

参见(2020年7月20日)by.
(于2020年8月4日合并)

:预取要打包的对象 签字人:Jonathan Tan

当发现要打包的对象丢失时,一批预取所有要打包的对象


在Git2.29(2020年第4季度)中,当使用packfile URI功能时,“()工作得更好

参见(2020年8月17日)by.
(于2020年9月3日合并)

:使packfile URI与
transfer.fsckobjects一起工作
签字人:Jonathan Tan

当使用packfile URI和
传输.fsckobjects=1
进行获取时,在调用
索引包时,使用
--fsck objects
而不是
--strict
标志,以便不检查链接,只检查对象

这是因为预期的链接不完整。(无论是否设置了
transfer.fsckobjects
,下载所有包后都将进行后续连接检查。)

这类似于(“
fetch pack
:不要检查部分fetch的链接”,2018-03-15,Git v2.17.0-rc1-),但用于packfile URI,而不是部分克隆


通过Git2.31(2021年第1季度),我们了解了更多关于使用packfile URI特性下载的packfile的信息

参见(2021年1月20日)作者 (于2021年2月3日合并)

:澄清作为URI发送的打包文件的内容 签字人:Jonathan Tan

请澄清,当使用packfile uri功能时,客户端不应假定下载的额外packfile仅包含单个blob,而应支持包含所有类型的多个对象的packfile

technical/packfile uri
现在包含在其中:

blob被排除,替换为uri。如下文“未来工作”所述 服务器将来可以发展为支持排除其他对象(或 服务器的实现可以支持(不包括其他对象) 不需要更改协议,因此客户端不应该期望packfiles 以这种方式下载的内容仅包含单个blob


Git 2.33(2021年第3季度)增强了对打包文件uri(用于获取,包括OP中的网络驱动器路径)的
uploadpack.blobPackfileUri
的描述:

参见(2021年5月13日)作者 (于2021年6月10日合并)

:修复blobPackfileUri描述 签字人:滕龙
审核人:谭国强

修复packfile-uri.txt中的“uploadpack.blobPackfileUri”描述,正确的格式也可以在t5702中看到

technical/packfile uri
现在包含在其中:

要由一个或多个
uploadpack.blobPackfileUri=
条目配置的服务器

每当要创建的对象列表 sent被组装,所有这样的blob被排除,替换为uri

如下面“未来工作”中所述,服务器可以在未来发展,以支持排除其他对象(或者可以使服务器的其他实现支持排除其他对象),而无需更改协议,因此客户端不应该期望以这种方式下载的包文件只包含单个blob

drichards@LT-DR MINGW32 /s/temp
$ git clone -v --progress <repo> gitrepo
Cloning into 'gitrepo'...
POST git-upload-pack (250 bytes)
remote: Counting objects: 82, done.
remote: Compressing objects: 100% (71/71), done.
fatal: failed to read object 9b081a422a5f7d06ff5a2cb4889d26b4f18c6181: Permission denied
fatal: unpack-objects failed
11:07:48.262535 run-command.c:336       trace: run_command: 'unpack-objects' '--pack_header=2,82'
11:07:48.324578 git.c:350               trace: built-in: git 'unpack-objects' '--pack_header=2,82'
fatal: failed to read object 9b081a422a5f7d06ff5a2cb4889d26b4f18c6181: Permission denied
fatal: unpack-objects failed
$ systeminfo
<snip>
OS Name:                   Microsoft Windows 8.1 Pro
OS Version:                6.3.9600 N/A Build 9600
<snip>
$ uname -a
MINGW32_NT-6.3-WOW LT-DR 2.5.0(0.295/5/3) 2016-03-31 18:26 i686 Msys
$ git --version
git version 2.8.3.windows.1