【问题标题】:Network failure during git fetch commandgit fetch 命令期间网络故障
【发布时间】:2022-12-03 04:01:05
【问题描述】:

我正在尝试调查如果网络在 git fetch 命令期间发生故障会发生什么。 我找不到任何真正详细介绍 fetch 命令的文档,并且深入研究 git C 源代码似乎有点不知所措。我在哪里可以找到一些很好的详细描述 fetch 的真正作用?

我正在研究使用 git 作为二进制文件备份解决方案的可能性。如果网络在获取过程中出现故障,git 会清理并删除下载的数据对象吗?或者它们会留在 .git 文件夹中吗?

【问题讨论】:

  • 根据我的经验,确实如此不是保留已下载的任何信息,以便从头开始。
  • 我猜它不会清理下载的数据对象,因为那只会意味着它必须在下一次再次下载它们。它们很可能会保持孤立状态,以防再次发生提取,它们最终将被 git gc 命令清除。但这只是我实现抓取的方式,不一定是实际完成的方式。
  • Git 很糟糕备份软件,出于我在Chapter 1 中提到的原因。任何擅长版本控制的软件都不擅长备份,反之亦然。

标签: git git-fetch


【解决方案1】:

有两种“类型”的传输用于获取和推送:

  • “哑巴”发送整个对象;
  • “聪明”的发送一个薄包装.

智能传输通常效率更高,因此大多数 Git 传输都使用智能方法。

使用smart方法时,git fetch会带一个瘦包过来,然后把瘦包“肥”成普通包。这个包就像任何其他包一样,像往常一样位于.git/objects/pack/。如果在包被完全接收之前连接中断,接收到的精简包必须(并且已经)被删除并且什么都没有留下:下一个git fetch 重新开始,生成一个新的并且很可能完全不同的精简包(它可能被压缩不同的基础对象)。

但是,当使用哑传输时,git fetch可以选择在每个对象完成后立即存储。是否这样做,我不知道。

请注意,git push 特别使用 Git 所谓的隔离区对于新传入的对象。在预接收和更新挂钩运行之前,对象被“隔离”,并且只有在需要时才会迁移到存储库的对象数据库。 (这种特殊的优化来自 GitHub 人员,他们不想保留因太大而被拒绝的数 GB 对象。GitHub 已经永久保留每个对象,所以这显然是可怕对于他们来说,在隔离的想法之前。)因此,即使使用愚蠢的传输,中途失败的推动也必须重新开始。

fetch 操作没有理由为隔离而烦恼,而且大概不会这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多