如何修改使用 git 源仅提取浅层克隆的 PKGBUILD?

23 arch-linux git

有一天,我尝试安装opencv-gitAURmakepkg上Arch Linux的。当然,正如名称所示,它是从git存储库中提取的。这会拉出 1Gb。我读有关使浅克隆git。当我查看PKGBUILD文件时,使用grep git PKGBUILD,我看到:

pkgname="opencv-git"
makedepends=('git' 'cmake' 'python2-numpy' 'mesa' 'eigen2')
provides=("${pkgname%-git}")
conflicts=("${pkgname%-git}")
source=("${pkgname%-git}::git+http://github.com/Itseez/opencv.git"
    cd "${srcdir}/${pkgname%-git}"
    git describe --long | sed -r 's/([^-]*-g)/r\1/;s/-/./g'
    cd "${srcdir}/${pkgname%-git}"
    cd "${srcdir}/${pkgname%-git}"
    cd "${srcdir}/${pkgname%-git}"
    install -Dm644 "LICENSE" "${pkgdir}/usr/share/licenses/${pkgname%-git}/LICENSE"
Run Code Online (Sandbox Code Playgroud)

有没有办法修改配方或makepkg命令以仅提取浅克隆(源的最新版本是我想要的)而不是完整的存储库以节省空间和带宽?阅读man 5 PKGBUILD并没有提供我正在寻找的洞察力。还快速浏览了makepkgpacman 联机帮助页- 似乎无法找到如何做到这一点。

Str*_*Bad 15

这可以通过使用自定义dlagent来完成。我不太了解 Arch 包装或 dlagents 是如何工作的,所以我只有一个 hack 答案,但它可以完成工作。

这个想法是修改 PKGBUILD 以使用自定义下载代理。我修改了源码

"${pkgname%-git}::git+http://github.com/Itseez/opencv.git"
Run Code Online (Sandbox Code Playgroud)

进入

"${pkgname%-git}::mygit://opencv.git"
Run Code Online (Sandbox Code Playgroud)

然后定义了一个新的 dlagent 调用mygit,它通过

makepkg DLAGENTS='mygit::/usr/bin/git clone --depth 1 http://github.com/Itseez/opencv.git'
Run Code Online (Sandbox Code Playgroud)

另请注意,正在克隆的存储库已硬编码到命令中。同样,这可能可以避免。最后,下载位置不是 PKGBUILD 所期望的。为了解决这个问题,我只需在下载后移动存储库。我通过添加来做到这一点

mv "${srcdir}/../mygit:/opencv.git" "${srcdir}/../${pkgname%-git}"
Run Code Online (Sandbox Code Playgroud)

pkgver函数的开头。

我认为更清洁的解决方案是弄清楚git+httpdlagent 正在做什么并暂时对其进行重新调整。这应该避免解决方案的所有黑客方面。


ami*_*zed 12

我个人修改了 makepkg 脚本,它就像一个魅力:

# vim `which makepkg` +/clone
...
541         msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "git"
542         if ! git clone --mirror "$url" "$dir"; then
543             error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "git"
...
Run Code Online (Sandbox Code Playgroud)

将“--mirror --single-branch --depth 1”附加到“git clone”命令:

541         msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "git"
542         if ! git clone --mirror --single-branch --depth 1 "$url" "$dir"; then
543             error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "git"
Run Code Online (Sandbox Code Playgroud)

这是一个差异视图:

--- makepkg ...
+++ makepkg-patched ...
@@ -539,7 +539,7 @@

    if [[ ! -d "$dir" ]] || dir_is_empty "$dir" ; then
        msg2 "$(gettext "Cloning %s %s repo...")" "${repo}" "git"
-       if ! git clone --mirror "$url" "$dir"; then
+       if ! git clone --mirror --single-branch --depth 1 "$url" "$dir"; then
            error "$(gettext "Failure while downloading %s %s repo")" "${repo}" "git"
            plain "$(gettext "Aborting...")"
            exit 1
Run Code Online (Sandbox Code Playgroud)

  • 注意:现在应该修补`/usr/share/makepkg/source/git.sh` (9认同)

Fah*_*tha 6

根据https://bugs.archlinux.org/task/23065(归功于 jasonwryan),向 AUR PKGBUILD 添加浅层克隆功能是一个愿望清单项目,于 2011 年 3 月 5 日星期六关闭,评论如下:

关闭原因:不会执行

这表明除非有人提交补丁,否则它不会发生。

正如我在评论中向发帖人建议的那样,他几乎可以肯定地将这个过程分成两个步骤来完成他正在尝试做的事情:

  1. 使用浅克隆克隆 git 存储库
  2. 运行 PKGBUILD 配方,但将其指向本地克隆。我不是 Arch 用户,所以不知道是否是这种情况,但我会对强制用户从远程克隆存储库以构建包的包构建系统感到非常惊讶。