致命:早期EOF致命:索引包失败

Wil*_*iam 241 git cygwin msysgit

我用Google搜索并找到了许多解决方案,但对我来说都没有用.

我试图通过连接到LAN网络中的远程服务器从一台计算机克隆.
从另一台计算机运行此命令会导致错误.
但是在服务器上使用git://192.168.8.5运行SAME clone命令它没关系并且成功.

有任何想法吗 ?

user@USER ~
$ git clone  -v git://192.168.8.5/butterfly025.git
Cloning into 'butterfly025'...
remote: Counting objects: 4846, done.
remote: Compressing objects: 100% (3256/3256), done.
fatal: read error: Invalid argument, 255.05 MiB | 1.35 MiB/s
fatal: early EOF
fatal: index-pack failed
Run Code Online (Sandbox Code Playgroud)

我已添加此配置,.gitconfig但也没有帮助.
使用git版本1.8.5.2.msysgit.0

[core]
    compression = -1
Run Code Online (Sandbox Code Playgroud)

ing*_*ere 452

首先,关闭压缩:

git config --global core.compression 0
Run Code Online (Sandbox Code Playgroud)

接下来,让我们做一个部分克隆来截断下来的信息量:

git clone --depth 1 <repo_URI>
Run Code Online (Sandbox Code Playgroud)

当它工作时,进入新目录并检索克隆的其余部分:

git fetch --unshallow 
Run Code Online (Sandbox Code Playgroud)

或者,或者,

git fetch --depth=2147483647
Run Code Online (Sandbox Code Playgroud)

现在,做一个普通的拉:

git pull --all
Run Code Online (Sandbox Code Playgroud)

我认为在1.8.x版本中有一个msysgit的故障加剧了这些症状,所以另一个选择是尝试使用早期版本的git(<= 1.8.3,我认为).

  • 请注意,这不是一个真正的解决方案,因为它会将提取设置为仅一个分支,您可能最终会遇到这种情况:http://stackoverflow.com/questions/20338500/git-repository-lost-its-remote-branches (8认同)
  • 谢谢,这很有效.我曾尝试更改不起作用的http.postbuffer,但是按照这个答案中所说的那样,它运行得很好.我没有使用"git fetch --depth = 2147483647"行,但我使用了其余的. (6认同)
  • @Jose A. - 当我使用较新版本的msysgit时,我遇到了这个问题.如果您使用的是msysgit,请尝试旧版本(<= 1.8.3).否则,尝试git fetch --depth 1000(然后是2000等,逐渐增加,直到拉出所有文件). (6认同)
  • 只需禁用压缩就可以修复它。 (3认同)
  • @ EthenA.Wilson之后您需要传入存储库的远程URL.例如`git clone --depth 1 git @ host:user/my_project.git`. (2认同)
  • @Jose A. - 另外,请看一下:http://stackoverflow.com/questions/4826639/repack-of-git-repository-fails (2认同)
  • 嗨亲爱的朋友.谢谢你的出色解决方案.但最后一个`git pull --all`不起作用.因为`git clone --depth 1`将设置获取范围只有一个分支.所以我们必须首先编辑.git/config. (2认同)
  • 此外,使用`git clone --depth 1 &lt;repo_URI&gt;` 后跟`git fetch --unshallow` 后跟`git pull --all` 我没有得到所有远程分支。`git branch -a` 不显示它们,只显示 `master`。如何在 unshallowed repo 中注册其他远程分支? (2认同)
  • 添加到@pjincz 评论中,对于我们来说不太熟悉 git 配置文件,让 `git fetch --all` 工作所需的实际更改是更改 `fetch = +refs/heads/master:refs/remotes /origin/master` 到 `fetch = +refs/heads/*:refs/remotes/origin/*`(`master` 到 `*`),这一行必须在节点 `[remote "origin"]` 下方。关闭文件并重复 `git fetch --all` 命令。使用 git 版本 `2.19.2.windows.1` 测试 (2认同)
  • `core.compression` 值用作所有其他压缩参数的默认值。如果存在网络问题或服务器不稳定,同时处理大量包或巨型文件,压缩可能会耗费大量时间。在处理网络不稳定(包括重试和潜在超时)时,压缩巨型文件的额外时间成本可能预示着超时。同样,在包含大文件的配置错误的服务器上进行增量压缩可能会加重内存使用量,因此禁用压缩可以通过防止内存瓶颈来纠正错误配置。 (2认同)

bhd*_*rkn 86

对于git的内存需求可能会发生此错误.您可以将这些行添加到您的全局git配置文件.gitconfig$USER_HOME,以便解决该问题.

[core] 
packedGitLimit = 512m 
packedGitWindowSize = 512m 
[pack] 
deltaCacheSize = 2047m 
packSizeLimit = 2047m 
windowMemory = 2047m
Run Code Online (Sandbox Code Playgroud)

  • 对我有用。但为所有属性设置8096m。 (6认同)
  • 必须是选定的答案 (4认同)
  • 在使用 Git 2.25.0 的 Windows 10 上,这个问题经常发生。我发现如果我从远程机器上重复执行“git pull”,它偶尔会成功。但真麻烦啊。然后我发现,如果您从内置的 Windows Bash 提示符中运行“git daemon”,它可以 100% 工作,无需任何解决方法。 (3认同)

Uma*_*bal 27

我遇到了同样的错误,在我这边我通过运行此命令解决了,在 Windows 中它有一些内存问题。

git config --global pack.windowsMemory 256m
Run Code Online (Sandbox Code Playgroud)


Tug*_*lik 19

我在使用 macOS Big Sur M1 芯片时遇到了这个问题,但没有一个解决方案对我有用。

编辑:也可作为 M2 芯片的解决方案。

我通过增加下面的 ulimit 解决了这个问题。

ulimit -f 2097152
ulimit -c 2097152
ulimit -n 2097152
Run Code Online (Sandbox Code Playgroud)

运行上面的命令仅对当前终端会话有效,因此首先运行此命令,然后克隆存储库。


Jac*_*cky 17

终于解决了 git config --global core.compression 9

从BitBucket问题线程:

我差不多尝试了五次,但它仍然会发生.

然后我尝试使用更好的压缩,它工作!

git config --global core.compression 9

来自Git文档:

core.compression
一个整数-1..9,表示默认的压缩级别.-1是zlib的默认值.
0表示没有压缩,1..9是各种速度/大小权衡,9表示最慢.
如果设置,则为其他压缩变量提供默认值,例如core.looseCompression和pack.compression.

  • 需要结合此解决方案运行“ git repack”,然后它才能工作。 (3认同)

cmp*_*kle 12

如@ingyhere所说:

浅克隆

首先,关闭压缩:

git config --global core.compression 0
Run Code Online (Sandbox Code Playgroud)

接下来,让我们进行部分克隆以截断掉下来的信息量:

git clone --depth 1 <repo_URI>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,进入新目录并检索克隆的其余部分:

git fetch --unshallow
Run Code Online (Sandbox Code Playgroud)

或者,

git fetch --depth=2147483647
Run Code Online (Sandbox Code Playgroud)

现在,拉一下:

git pull --all
Run Code Online (Sandbox Code Playgroud)

然后解决你的本地分支只跟踪高手的问题

.git/config在您选择的编辑器中打开您的git配置文件()

它说:

[remote "origin"]
    url=<git repo url>
    fetch = +refs/heads/master:refs/remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

换线

fetch = +refs/heads/master:refs/remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

fetch = +refs/heads/*:refs/remotes/origin/*
Run Code Online (Sandbox Code Playgroud)

进行git fetch并git将立即拉出所有远程分支

  • 它有效,但我将压缩设置为 9 而不是 0,但失败了。 (3认同)

小智 9

就我而言,这非常有帮助:

git clone --depth 1 --branch $BRANCH $URL
Run Code Online (Sandbox Code Playgroud)

这会将结帐仅限于提及的分支,因此将加快流程。

希望这会有所帮助。


小智 7

设置下面的配置对我不起作用。

[core] 
packedGitLimit = 512m 
packedGitWindowSize = 512m 
[pack] 
deltaCacheSize = 2047m 
packSizeLimit = 2047m 
windowMemory = 2047m
Run Code Online (Sandbox Code Playgroud)

正如之前的评论,这可能是 git 的内存问题。因此,我尝试减少工作线程(从 32 个减少到 8 个)。这样它就不会同时从服务器获取太多数据。然后我还添加“-f”以强制同步其他项目。

-f: Proceed with syncing other projects even if a project fails to sync.
Run Code Online (Sandbox Code Playgroud)

那么现在就可以正常工作了。

repo sync -f -j8
Run Code Online (Sandbox Code Playgroud)


Mic*_*roń 7

这很令人困惑,因为 Git 日志可能会建议任何连接或 ssh 授权错误,例如:ssh_dispatch_run_fatal: Connection to x.x.x.x port yy: message authentication code incorrect, the remote end hung up unexpectedly, early EOF

服务器端解决方案

让我们在服务器端优化 git 存储库:

  1. 进入我的服务器的 git bare 存储库。
  2. 称呼git gc
  3. 称呼git repack -A

例如:

ssh admin@my_server_url.com
sudo su git
cd /home/git/my_repo_name # where my server's bare repository exists.
git gc
git repack -A
Run Code Online (Sandbox Code Playgroud)

现在我可以毫无错误地克隆这个存储库,例如在客户端:

git clone git@my_server_url.com:my_repo_name
Run Code Online (Sandbox Code Playgroud)

git gc可以在 git 客户端调用该命令以避免类似git push问题。


如果您是 Gitlab 服务的管理员 - 手动触发Housekeeping。它在内部调用git gcgit repack.


客户端解决方案

其他(黑客,仅限客户端)解决方案是下载没有历史记录的最后一个主版本:

git clone --single-branch --depth=1 git@my_server_url.com:my_repo_name
Run Code Online (Sandbox Code Playgroud)

有可能不会发生缓冲区溢出。


And*_*zlo 6

当git内存不足时,我收到了这个错误.

释放一些内存(在这种情况下:让编译工作完成)并再次尝试为我工作.


ibe*_*beu 6

就我而言,这是一个连接问题。我连接到内部 wifi 网络,在该网络中我对资源的访问受到限制。那是让 git 进行获取,但在某个时间它崩溃了。这意味着它可能是网络连接问题。检查一切是否正常运行:防病毒、防火墙等。

因此,elin3t 的回答很重要,因为 ssh 提高了下载的性能,从而可以避免网络问题


Von*_*onC 6

请注意,Git 2.13.x/2.14(2017 年第 3 季度)确实提高了默认值,core.packedGitLimit这会影响git fetch
在较大平台上提高了默认的 Packed-git 限制值(从 8 GiB 到 32 GiBgit fetch ),以将“ ”从(可恢复的)故障中拯救出来。而“ gc”则并行运行。

请参阅David Turner提交的 be4ca29(2017 年 4 月 20 日) ( )。 帮助者:杰夫·金 (Jeff King )(由Junio C Hamano 合并 -- --提交 d97141b中,2017 年 5 月 16 日)csusbdt
peff
gitster

增加core.packedGitLimit

core.packedGitLimit超过时,git 将关闭包。
如果重新打包操作与获取并行进行,则获取可能会打开一个包,然后由于达到了 PackedGitLimit 而被迫关闭它。
然后,重新打包可能会从提取下删除该包,从而导致提取失败。

增加core.packedGitLimit的默认值可以防止这种情况发生。

在当前的 64 位 x86_64 机器上,有 48 位的地址空间可用。
64 位 ARM 机器似乎没有标准的地址空间量(即,它因制造商而异),而 IA64 和 POWER 机器则具有完整的 64 位。
所以 48 位是我们可以合理关心的唯一限制。我们保留 48 位地址空间中的一些位供内核使用(这不是绝对必要的,但最好是安全起见),并使用剩余的 45 位。
任何时候都不会有这么大的 git 存储库很快,所以这应该可以防止失败。


Cha*_*ang 6

我也面临这个问题,这是我的解决方案:

git fetch --refetch
Run Code Online (Sandbox Code Playgroud)

来自git-fetch帮助:

此选项不会与服务器协商以避免传输本地已存在的提交和关联对象,而是会像新克隆一样获取所有对象


eli*_*n3t 5

我尝试了所有这些命令,但没有一个对我有用,但是有效的方法是将git_url更改为http而不是ssh

如果是clone命令,请执行以下操作:

git clone <your_http_or_https_repo_url> 
Run Code Online (Sandbox Code Playgroud)

否则,如果您要使用现有存储库,请执行以下操作

git remote set-url origin <your_http_or_https_repo_url>
Run Code Online (Sandbox Code Playgroud)

希望这对某人有所帮助!

  • 是的!这对我有用,我有一个 4gb+ 的存储库,我得到的唯一一个解决方案就是这个! (2认同)
  • 它对我有用,谢谢!通过“https”克隆,然后将远程设置回“ssh”。 (2认同)
  • 我真的很想知道_为什么_这有效。SSH 协议中是否有某些东西会在大型对象上造成阻塞,而 HTTPS 则不会?这是传输层问题吗? (2认同)

8DH*_*8DH 5

之前的答案建议设置为 512m。我想说,有理由认为这在 64 位架构上会适得其反。core.packedGitLimit 的文档说:

32 位平台上的默认值为 256 MiB,64 位平台上的默认值为 32 TiB(实际上无限制)。这对于所有用户/操作系统来说都是合理的,除了最大的项目。您可能不需要调整该值。

如果您想尝试一下,请检查是否已设置,然后删除该设置:

git config --show-origin core.packedGitLimit
git config --unset --global core.packedGitLimit
Run Code Online (Sandbox Code Playgroud)

编辑:这里有一个衔尾蛇时刻,应该提到的是,这与@ amirreza-moeini-yegane的解决方案相结合,今天为我解决了这个问题。

git config --global core.compression 0
Run Code Online (Sandbox Code Playgroud)