前几天我尝试安装opencv-git
来自尿素尿率在makepkg
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
没有提供我正在寻找的见解。还快速浏览了makepkg
和pacman
联机帮助页- 似乎无法找到如何做到这一点。
答案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+http
dlagent 正在做什么并暂时重新调整。这应该避免解决方案的所有黑客方面。
答案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 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"
这是一个差异视图:
--- 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 日星期六关闭,评论如下:
关闭原因:不会实施
这表明除非有人提交补丁,否则这种情况不会发生。
正如我在评论中向发帖者建议的那样,他想要做的事情几乎可以肯定可以通过将过程分为两个步骤来完成:
- 使用浅克隆克隆 git 存储库
- 运行 PKGBUILD 配方,但将其指向本地克隆。我不是 Arch 用户,所以不知道情况是否如此,但我对强制用户从远程克隆存储库以构建包的包构建系统感到非常惊讶。
答案4
如果您不想修改 makepkg 脚本。
如概述的这里、指向DEVELSRCDIR
或/etc/yaourtrc
归档~/.yaourtrc
某个持久文件夹。然后所有存储库签出(git/svn/...)都将发生在该文件夹中。克隆存储库后,将仅执行最新版本的快速获取,而不是每次都执行完整克隆。