Git shallow clone与一些子模块

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (271)

我想获得一些Qt模块的源代码。我不需要更改历史记录和大多数Qt子模块,因此我决定克隆Qt Git repo并初始化并更新一些模块:

git clone --branch v5.10.1 --depth 1 git://code.qt.io/qt/qt5.git source
cd source
git submodule update --init --depth 1 qtbase qtlocation

但是,当我尝试运行上面的代码时,它会给我以下错误:

fatal: The remote end hung up unexpectedly
Fetched in submodule path 'qtbase', but it did not contain 6c6ace9d23f90845fd424e474d38fe30f070775e. Direct fetching of that commit failed.

如果我正在尝试初始化和更新所有子模块,它可以工作:

git clone --branch v5.10.1 --depth 1 git://code.qt.io/qt/qt5.git source
cd source
git submodule update --init --depth 1

如何获取git repo的源代码,包括一些没有版本历史的子模块?

提问于
用户回答回答于

我在Ubuntu 18.04中使用最新的整个版本做类似的事情。要做到这一点,我设置ver等于一个git ls-remotegreps out整数版本然后排序升序并抓住最后一个。在撰写本文时,结果是5.12.1

ver="$(git ls-remote --heads https://code.qt.io/qt/qt5.git | grep -Pio '(?<=refs/heads/)[\d\.]+' | sort -V | tail -1)" ; git clone --depth 1 --branch $ver https://code.qt.io/qt/qt5.git

这个有点复杂。首先,我们将介绍essential addon preview deprecated.gitmodules中列出的模块组。从那里我将回到每个标题并过滤掉那些不包含的标题qtweb qtwin qtmac qtandroid qtpurch。我将根据其定义的分支版本遍历列表,执行每个列表的浅层克隆。

for value in $(grep -B10 -Pi 'status = (essential|addon|preview|deprecated)' .gitmodules | grep -Pio '(?<=\[submodule \")(?!qt(web|win|mac|android|purch)).*(?=\"\])' | sort); do git clone --depth 1 --branch $(grep -A6 -Pi "(?<=\[submodule \")$value(?=\"\])" .gitmodules | grep -Pio '(?<=\tbranch = ).*') https://code.qt.io/qt/"$value".git ; done

对我来说,最终目标是进行静态构建,所以我只会注意我使用的选项:

./configure -prefix $PWD/qtbase -static -confirm-license -opensource -ltcg -optimize-size -ccache -no-pch -skip webengine -nomake tests -nomake examples

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励