执行git fetch命令时网络故障



我正在尝试调查如果网络在git获取命令期间发生故障会发生什么。我找不到任何真正详细介绍fetch命令的文档,而深入研究git C源代码似乎有点难以承受。哪里能找到一些详细的描述取回到底做了什么?

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

有两种"类型"同时用于读取和推送的传输:

  • "dumb"发送整个对象;
  • "smart"一个发送薄包

智能传输通常更有效,所以大多数Git传输使用智能方法。

当使用智能方法时,git fetch将带来单个薄包,然后"增肥";薄包变成普通包。这个包就像任何其他包一样,像往常一样驻留在.git/objects/pack/中。如果连接在包被完全接收之前死亡,则必须删除接收到的瘦包,并且什么都不留下:下一个git fetch重新开始,生成一个新的,很可能完全不同的瘦包(它可能被压缩到不同的基本对象)。

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

注意,git push特别使用Git所称的隔离区来处理新的传入对象。对象被放置在"隔离区"。直到预接收和更新钩子运行,并且仅在需要时才迁移到存储库的对象数据库。(这个特殊的优化来自GitHub的人,他们不想保留几gb的对象,因为太大而被拒绝。GitHub已经永久保存了每个对象,所以在隔离的想法出现之前,这对他们来说显然是很糟糕的。因此,即使使用哑传输,中途失败的推送也必须重新开始。

fetch操作没有理由进行隔离,并且可能不会这样做。

最新更新