【问题标题】:How to run `git clone mirror` on large repo without failure?如何在大型仓库上运行“git clone mirror”而不失败?
【发布时间】:2021-11-17 00:47:40
【问题描述】:

我有一个 1.4Gb 的存储库,但实际代码更像是 250Mb。我正在尝试使用bfg 来缩小尺寸。

运行时git clone --mirror https://xxx@bitbucket.org/xxx/my-app.git

我明白了:

16:13:59.706806 pkt-line.c:80           packet:     sideband< \2Compressing objects:  99% (2662/2679)\15
16:14:00.093716 pkt-line.c:80           packet:     sideband< \2Compressing objects: 100% (2679/2679)\15
16:14:00.094381 pkt-line.c:80           packet:     sideband< \2Compressing objects: 100% (2679/2679), done.
remote: Compressing objects: 100% (2679/2679), done.
16:14:00.126076 pkt-line.c:80           packet:     sideband< PACK ...
16:14:00.126414 run-command.c:664       trace: run_command: git index-pack --stdin -v --fix-thin '--keep=fetch-pack 22026 on My-Mac-mini' --check-self-contained-and-connected --pack_header=2,43919
16:14:00.144702 exec-cmd.c:139          trace: resolved executable path from Darwin stack: /Applications/Xcode-13.0.0-Release.Candidate.app/Contents/Developer/usr/libexec/git-core/git
16:14:00.146271 exec-cmd.c:238          trace: resolved executable dir: /Applications/Xcode-13.0.0-Release.Candidate.app/Contents/Developer/usr/libexec/git-core
16:14:00.147252 git.c:444               trace: built-in: git index-pack --stdin -v --fix-thin '--keep=fetch-pack 22026 on My-Mac-mini' --check-self-contained-and-connected --pack_header=2,43919
16:21:03.324329 http.c:756              == Info: Connection #0 to host bitbucket.org left intact
16:21:03.324455 pkt-line.c:80           packet:          git< 0000
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: index-pack failed

我有以下环境变量:

export GIT_TRACE_PACKET=1                                                        
export GIT_TRACE=1
export GIT_CURL_VERBOSE=1

还有以下.gitconfig

[core]
        excludesfile = /Users/lewissmith/.gitignore_global
        compression = 0
        packedGitLimit = 512m
        packedGitWindowSize = 512m

[commit]
        template = /Users/xxx/.stCommitMsg

[pack]
deltaCacheSize = 2047m
packSizeLimit = 2047m
windowMemory = 2047m

我采取的大部分步骤都是基于这里的建议:Github - unexpected disconnect while reading sideband packet

我可以做些什么来让镜像克隆工作吗?或者我可以做些什么来进一步调试这个问题?

这个错误还暗示这是一个网络问题,对吗?

--

在@torek 的好建议之后,我跑了

git fetch --deepen 1

但我明白了

13:54:22.746101 http.c:756              == Info: Connection #0 to host bitbucket.org left intact
13:54:22.746280 pkt-line.c:80           packet:          git< 0000
fetch-pack: unexpected disconnect while reading sideband packet
fatal: protocol error: bad pack header

这是我需要处理 bitbucket 的事情吗?

【问题讨论】:

    标签: git


    【解决方案1】:

    认为您遇到了“服务器端超时,而客户端正在处理接收到的数据”错误。为了解决这个问题——这个方法可能行不通,但值得一试——你可以从:

    git clone --mirror --depth 1 <url>
    

    如果成功,进入克隆并运行:

    git fetch --unshallow
    

    这可能会失败;如果是这样,请尝试 git fetch --deepen 50 一次只获得 50 多个提交。根据成功与失败提高或降低此数字。最终,最终的git fetch --unshallow 应该会成功完成,并为您留下一个完整的(不是浅层的)克隆,您可以在其上运行 BFG。

    如果您无法通过这种方式解决此问题,则需要等待修复错误的 Git 版本。下面是对该错误的简短描述。

    出了什么问题

    克隆和获取都包括运行git fetchgit clone 命令内置了 fetch 步骤,因此您不必单独运行它,但两者都做同样的事情:

    • 他们与其他一些 Git 软件建立连接,并要求该 Git 软件在其一侧(在本例中为 Bitbucket)连接到某个存储库。这是“他们的 Git”:他们的软件,从他们的存储库中读取。

    • 他们现在让他们的 Git 溢出分支名称和其他感兴趣的名称。这些名称中的每一个都提供一个提交哈希 ID。

    • 他们的 Git 现在等待您的 Git 请求这些哈希 ID 中的一个或多个,可能还会请求构成历史的部分或全部较早提交。 (请记住,任何 Git 存储库都是提交的集合,它们是存储库中的历史记录,加上这些名称可以帮助您和 Git找到提交。)

    • 一旦您的 Git 软件和他们的 Git 软件就要发送哪些提交达成一致,他们的 Git 就会打包这些提交和支持对象。在这里您可以看到如下内容:

      remote: Compressing objects: 100% (2679/2679), done.
      

      这些是来自他们的 Git 的消息,报告他们打包提交和其他对象的进度(您可以在上面看到它们报告为“边带”消息)。然后他们将这个“包”发送给你的 Git。

    • 您的 Git 现在已经完成了与他们的 Git 的对话,因为他们不会真正发送任何其他内容。但是,您的 Git 软件此时无法关闭连接。您的 Git 现在开始分析包,检查其中没有错误,构建索引等等。所需时间取决于您的计算机速度和包的大小。

    • 当您的 Git 忙于检查它收到的包文件的有效性并为其创建索引时,另一个 Git 对缺乏活动感到不耐烦,并关闭连接

    • 您的 Git 将关闭的连接视为错误,删除包和部分索引文件,并报告提取失败。

    如果 fetch 正在由 git clone 运行,则克隆操作会删除整个存储库。如果提取是单独运行的(如git fetch --deepengit fetch --unshallow),它只会删除“失败”的包和相关文件。当然,这里没有什么必然失败,只是你的 Git 看到他们的 Git 断开连接,认为出了点问题。

    【讨论】:

    • 多么好的答案,谢谢!像你这样的人让 SO 成为一个很棒的地方。我更新了我的问题,我什至无法使用 --deepen 1
    • 是的,在这种情况下,您可能需要更快的客户端计算机,或者修复 Git 本身。您可以尝试使用 ssh 而不是 https 进行克隆,以防超时时间不同(更长,可能希望 :-))。
    • 最后,通过 ssh 克隆产生了影响,我得到了它的工作。再次感谢。
    • 顺便提一下,最近对 Git 开发版本的提交会提前关闭连接。这导致了一些其他小问题的出现,但它们正在被修复,或者现在已经修复,下一个版本应该会整体修复这个问题。
    猜你喜欢
    • 2018-03-21
    • 1970-01-01
    • 2020-05-01
    • 2016-06-29
    • 2011-09-03
    • 2010-12-28
    • 1970-01-01
    • 2013-03-08
    • 2019-04-25
    相关资源
    最近更新 更多