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

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

前几天我尝试安装opencv-git来自尿素尿率makepkgArch 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"

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

答案1

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

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

"${pkgname%-git}::git+http://github.com/Itseez/opencv.git"

进入

"${pkgname%-git}::mygit://opencv.git"

然后定义了一个新的 dlagent,mygit它通过以下方式进行浅克隆:

makepkg DLAGENTS='mygit::/usr/bin/git clone --depth 1 http://github.com/Itseez/opencv.git'

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

mv "${srcdir}/../mygit:/opencv.git" "${srcdir}/../${pkgname%-git}"

在函数的开头pkgver

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

答案2

我个人修改了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"
...

附加--mirror --single-branch --depth 1git 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"

这是一个差异视图:

--- 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

答案3

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

关闭原因:不会实施

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

正如我在评论中向发帖者建议的那样,他想要做的事情几乎可以肯定可以通过将过程分为两个步骤来完成:

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

答案4

如果您不想修改 makepkg 脚本。

如概述的这里、指向DEVELSRCDIR/etc/yaourtrc归档~/.yaourtrc某个持久文件夹。然后所有存储库签出(git/svn/...)都将发生在该文件夹中。克隆存储库后,将仅执行最新版本的快速获取,而不是每次都执行完整克隆。

相关内容