【问题标题】:LibGit2Sharp Clone fails with LibGit2SharpException: Failed to mmapLibGit2Sharp 克隆失败并出现 LibGit2SharpException: Failed to mmap
【发布时间】:2026-01-06 18:05:02
【问题描述】:

尝试使用 LibGit2Sharp v.0.18.1.0 克隆远程存储库会引发此异常:

LibGit2Sharp.LibGit2SharpException:映射失败。无效的句柄值:文件的卷已被外部更改,因此打开的文件不再有效。

在 LibGit2Sharp.Core.Ensure.HandleError(Int32 结果) 在 LibGit2Sharp.Core.Ensure.ZeroResult(Int32 结果) 在 LibGit2Sharp.Core.Proxy.git_clone(字符串 url,字符串工作目录,GitCloneOptions& opts) 在 LibGit2Sharp.Repository.Clone(String sourceUrl, String workdirPath, CloneOptions options)

使用相同的 url 和 workdir,我已经使用 Git Bash 和 SourceTree 成功地克隆了存储库。但对于我的任务,我需要以编程方式完成,而 LibGit2Sharp 似乎是一个不错的选择。

更新:不知何故错误发生了变化,现在我得到了大约 20KB 的远程存储库,然后出现了这个错误:

在 LibGit2Sharp.dll 中发生了“System.AccessViolationException”类型的第一次机会异常

附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。

更新 2:AccessViolationException 是由不同的原因引起的(尝试使用 emtpy 字符串作为远程 url 进行克隆!)

【问题讨论】:

  • 请在 issue tracker 中提出问题。我们很乐意看看它。
  • @kayak58 在我存储在 Stash 中的存储库上运行 GitVersion 应用程序时,我面临的错误几乎与您完全相同。不幸的是,我的回购是私人的,我不能与公众分享。你的回购有可能是公开的吗?这样 LibGit2Sharp 的维护者也许可以看一看,看看发生了什么?
  • 已创建问题:#794
  • @Gary:不幸的是,我也访问了 Stash 上的私人仓库,但我可能会说服所有者公开仓库进行测试。
  • @kayak58,如果可以的话,那就太好了。不幸的是,我没有那种奢侈 :-( 有趣的是我们都在运行 Stash。你使用的是哪个版本的 Stash?

标签: libgit2sharp


【解决方案1】:

TL;DR

这是 LibGit2Sharp v0.18.1 的问题。这将在即将发布的 v0.19 中修复(请参阅 PR #798)。

更多详细信息

看起来 Stash 在获取存储库时发送空数据包以保持连接处于活动状态。因此,LibGit2Sharp v0.18.1 中的嵌入式 libgit2 版本试图映射一个零长度文件,从而导致错误。

同时在 libgit2 中通过提交 libgit2/libgit2@bc8a08868 修复了它。

更新

Pull Request 已合并,该问题已在现已发布的 LibGit2Sharp v0.19 中修复。这个问题应该不会再发生了。

【讨论】: