git shallow clone 的一个问题

栏目: IT技术 · 发布时间: 4年前

内容简介:最近在家办公,遇到的第一个问题就是家里网络极不稳定,无法 git clone 那些庞大的仓库。我知道 git 现在支持浅拷贝,用 --depth 1 就可以取出某个分支的 HEAD 指向的拷贝所依赖的所有文件。但是,光用 git clone url --depth 1 还不能解决我的所有问题。因为需要传输的文件还是太大,不稳定的网络无法坚持到我顺利下载完成就断开了。而 git clone 得下载过程似乎不能续传,我只好另辟蹊径。过去翻 git 文档时,曾经了解过有一个 git bundle 这个指令可以对需

最近在家办公,遇到的第一个问题就是家里网络极不稳定,无法 git clone 那些庞大的仓库。我知道 git 现在支持浅拷贝,用 --depth 1 就可以取出某个分支的 HEAD 指向的拷贝所依赖的所有文件。

但是,光用 git clone url --depth 1 还不能解决我的所有问题。因为需要传输的文件还是太大,不稳定的网络无法坚持到我顺利下载完成就断开了。而 git clone 得下载过程似乎不能续传,我只好另辟蹊径。

过去翻 git 文档时,曾经了解过有一个 git bundle 这个指令可以对需要传输的内容打包,然后大多数依赖接受数据的 git 指令都可以直接接收用 git bundle 打好的包,而不必通过网络传输。事实上,git clone 的过程就是在远程打好包,然后传输到本地,再解开的。

我想好的曲线救国的策略就是,找一台远程连接顺畅的虚拟主机,进行这样的步骤:

  1. git clone url --depth 1 在远程复制一份仓库的浅拷贝
  2. git bundle create bundlefile --all 打个包。
  3. 用支持续传的 sftp 下载这个 bundlefile 到本地。
  4. 在本地用 git clone bundlefile 还原。

但实际操作到第 4 步的时候,发现 git 报告 "fatal: Failed to traverse parents of commit xxxxxxxx" ,这个 xxxxxxxx 就是我那个仓库 HEAD 的 hash 。

我 google 了一下,找到 一篇 2015 年的帖子 ,谈的是同样的问题。

大意是说,当我们的仓库是一个 shallow clone 的时候,有一个 .git/shallow 文件指明了这点。但是 bundle 却没有打包进这个文件。也就是说,一个 bundle 无法说明自己是一个 shallow clone 。

根据我的理解,bundle 其实是 git 给仓库生成的 delta 信息,而非对整个仓库的复制。而 git clone 必须依赖 base 和 delta 才能还原仓库(不知道是否理解正确)。对于完整仓库的 bundle 是一个特例,我们可以从中还原出来,但是对于 shallow 仓库来说,缺少了 delta 就失败了。

鉴于这个帖子的讨论是 2015 年的,可能现在已经解决了。但我把本地的 git client 升级到了最新的 2.25.0 ,依然无法处理以上问题。

不过,这个 bundlefile 文件中又的确包含有我需要的所有文件,那么终归是有办法的。

我尝试用 git init 创建了一个新仓库,然后在仓库下运行 git bundle unbundle bundlefile ,还原出所有仓库文件。这时的仓库是没有 HEAD 的,不过既然我们知道 HEAD hash ,可以自己用 git checkout hash 取出来。然后再用 git switch -c master 固定在主分支上就好了。所有文件都能顺利检出。

不过,接下来,我们运行 git log 会发现出错。再检查,的确是缺少 .git/shallow 文件,也就是说现在复制出来的这个仓库,git 还不知道是 shallow clone 。好在这个文件很简单,就是 HEAD 的 hash 。手工创建一个就好了。

到这一步,大功告成。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript DOM编程艺术

JavaScript DOM编程艺术

Jeremy Keith / 杨涛、王建桥、杨晓云 / 人民邮电出版社 / 2006年12月 / 39.00元

本书讲述了JavaScript和DOM的基础知识,但重点放在DOM编程技术背后的思路和原则:预留退路、循序渐进和以用户为中心等,这些概念对于任何前端Web开发工作都非常重要。本书将这些概念贯穿在书中的所有代码示例中,使你看到用来创建图片库页面的脚本、用来创建动画效果的脚本和用来丰富页面元素呈现效果的脚本,最后结合所讲述的内容创建了一个实际的网站。 本书适合Web设计师和开发人员阅读。一起来看看 《JavaScript DOM编程艺术》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具