git shallow clone 的一个问题
- git clone url –depth 1 在远程复制一份仓库的浅拷贝
- git bundle create bundlefile –all 打个包。
- 用支持续传的 sftp 下载这个 bundlefile 到本地。
- 在本地用 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 。手工创建一个就好了。
到这一步,大功告成。