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


18

有一天,我尝试安装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"

有没有办法修改配方或makepkg命令以仅提取浅克隆(我想要的是源的最新版本),而没有完整的存储库以节省空间和带宽?阅读man 5 PKGBUILD并不能提供我所需要的见识。还快速浏览了makepkgpacman 联机帮助页 -似乎找不到解决方法。


“最终,我未能成功构建配方。” 您到底做了什么,哪里出了问题?请提供更多详细信息。正如有人曾经在IRC上告诉我的那样,很不幸,我们把水晶球留在家中。听起来似乎是在两行之间读取,好像git repos无法成功克隆(可能是由于网络问题)?但是我只是在猜测。请明确。
Faheem Mitha 2014年

有根据的猜测是,您可以将过程分为两部分。首先,将git repos克隆为浅克隆或其他形式。然后应用食谱。我猜您可以将git+http://github.com/Itseez/opencv.gitAUR配方中的网络地址替换为本地路径名。你有尝试过吗?如果此构建系统即使您在本地有可用存储库也要强制克隆该存储库,那么它实在是太疯狂了。
Faheem Mitha 2014年

@FaheemMitha谢谢,我删除了关于构建失败的参考-我不在乎。我正在寻找一种可以基于您所描述的东西的集成解决方案。我认为,如果有本地内容,可能会有不下载的选项……

如果您提出此问题的主要原因是避免使用不必要的带宽/空间,那么明确地说也不会有任何伤害。就像我说的那样,请尝试仅使用本地路径-这可能会出于最小惊讶的原则。如果在手册页上没有提供用于指定浅表克隆的选项,则功能可能不可用。我建议在适当的Arch论坛中询问,也许是专门针对该构建系统的邮件列表。首先明确该功能是否存在;如果没有,您可以提交愿望清单错误。
Faheem Mitha 2014年

Answers:


13

这可以通过使用自定义dlagent完成。我不太了解Arch打包或dlagents的工作原理,所以我只有一个简单的答案,但是它可以完成工作。

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

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

进入

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

然后定义一个新的dlagent mygit进行浅层克隆。我通过DLAGENTS/etc/makepkg.conf以下dlagent中添加数组来完成此操作:

'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在做什么,并暂时重新定义它。这应该避免解决方案的所有hack问题。


谢谢,这有效。是的,它需要一些工作来抽象化它,以在除此以外的其他情况下工作。但这值得调查,您的回答是有效的概念证明。因此,我已将所选答案更改为您的答案。

11

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

在“ git clone”命令后附加“ --mirror --single-branch --depth 1”:

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

现在,安装softethervpn-git仅下载100M,而不是黑客之前下载468M。
2015年

辉煌!万分感谢!这应该是默认值。
ccpizza

注意:PKGBUILD将失败,具体取决于标记。看到这个讨论。然而,它可能可以通过使用片段那里(固定branchtagcommit等等)。
BenC

7
注意:现在/usr/share/makepkg/source/git.sh应该改打补丁
nponeccop

6

根据https://bugs.archlinux.org/task/23065(致谢jasonwryan)的说法,向AUR PKGBUILD添加浅层克隆功能是一个愿望清单项目,该项目于2011年3月5日(星期六)关闭,并带有以下注释:

结案原因:无法实施

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

正如我在评论中向发布者建议的那样,他的工作几乎可以肯定地通过将过程分为两个步骤来完成:

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

谢谢。在链接的注释中,将讨论有关此修改如何给脚本工作流程带来意外后果的讨论。问题是git如何填充和链接丢失的对象等。-如果我理解正确的话,磁盘使用不会有任何好处。的确,我尝试在配方目录中进行一个浅表克隆,最终克隆为1GB +,但是被makepkg(pkgver抱怨但仍然抱怨)并且也可以使用!

2

如果在与相同的目录中对存储库进行浅镜像,则PKGBUILD可以makepkg --holdver用来防止makepkg更新存储库的其余部分。这消除了需要修改的PKGBUILDmakepkg.confmakepkg本身; 但是,克隆/更新存储库需要手动完成。

作为一个示例cling-git,这通常克隆的整体llvmclang

$ git clone --mirror --depth=1 --branch=cling-patches http://root.cern.ch/git/llvm.git llvm
$ git clone --mirror --depth=1 --branch=cling-patches http://root.cern.ch/git/clang.git clang
$ git clone --mirror --depth=1 http://root.cern.ch/git/cling.git cling

$ makepkg --holdver

在makepkg手册页中:

--holdver
    When using VCS sources (PKGBUILD(5)) any currently checked out source
    will not be updated to the latest revision.

请注意,makepkg仍会克隆尚不存在的cling存储库,这意味着在上面的示例中,由于它不是那么大,我本可以省略手动克隆存储库。


1

如果您不想修改makepkg脚本。

作为概括这里,点DEVELSRCDIR/etc/yaourtrc~/.yaourtrc文件中一些持久文件夹。然后,所有存储库检出(git / svn / ...)都将在此文件夹中发生。克隆存储库后,将仅执行具有最新修订的快速访存,而不是每次都进行完整克隆。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.