Bagaimana cara memodifikasi PKGBUILD yang menggunakan sumber git untuk menarik hanya klon yang dangkal?

18

Suatu hari saya mencoba menginstal opencv-gitdari AUR dengan makepkgdi Arch Linux. Tentu saja itu menarik dari repositori git seperti namanya. Ini menarik 1Gb. Saya membaca tentang membuat klon dangkal dengan git. Ketika saya melihat PKGBUILDfile, menggunakan grep git PKGBUILD, saya melihat:

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"

Apakah ada cara untuk mengubah resep atau makepkgperintah untuk menarik hanya klon dangkal (versi terbaru dari sumber adalah apa yang saya inginkan) dan bukan repositori lengkap untuk menghemat ruang dan bandwidth? Membaca man 5 PKGBUILDtidak memberikan wawasan yang saya cari. Juga melihat dengan cepat melalui makepkgdan pacman halaman manual - tampaknya tidak dapat menemukan cara untuk melakukan itu.

HalosGhost
sumber
"Pada akhirnya aku gagal dalam berhasil membangun resep." Apa yang Anda lakukan dengan tepat, dan apa yang salah? Tolong berikan lebih banyak detail. Seperti seseorang pernah mengatakan kepada saya di IRC, sayangnya kami meninggalkan bola kristal kami di rumah. Kedengarannya, membaca yang tersirat, seolah-olah repo git gagal berhasil dikloning, mungkin karena masalah jaringan? Tapi saya hanya menebak. Tolong jelaskan.
Faheem Mitha
Dugaan berpendidikan adalah Anda dapat membagi proses menjadi dua bagian. Pertama klon repo git sebagai klon dangkal atau apa pun. Lalu terapkan resepnya. Saya kira Anda bisa mengganti alamat jaringan git+http://github.com/Itseez/opencv.gitdalam resep AUR dengan nama path lokal. Sudahkah Anda mencobanya? Jika sistem build ini memaksa Anda untuk mengkloning repo walaupun Anda memilikinya tersedia secara lokal, maka itu sangat gila.
Faheem Mitha
@FaheemMitha Terima kasih, saya telah menghapus referensi untuk gagal di build - Saya tidak peduli. Saya mencari solusi terintegrasi yang dapat didasarkan pada sesuatu seperti apa yang Anda gambarkan. Saya pikir mungkin ada opsi untuk tidak mengunduh jika ada konten lokal ...
Jika alasan utama Anda mengajukan pertanyaan ini adalah untuk menghindari penggunaan bandwidth / ruang yang tidak perlu, maka tidak ada salahnya untuk mengatakannya secara eksplisit. Seperti yang saya katakan, cobalah hanya menggunakan jalur lokal - ini mungkin akan bekerja dengan prinsip paling tidak mengejutkan. Jika opsi untuk menentukan klon dangkal tidak diberikan pada halaman manual, ada kemungkinan fungsionalitas tidak tersedia. Saya sarankan bertanya di forum Arch yang sesuai, mungkin milis yang didedikasikan untuk sistem pembangunan itu. Pertama, klarifikasi apakah fungsi itu ada; jika tidak, Anda dapat mengajukan bug wishlist.
Faheem Mitha

Jawaban:

13

Ini dapat dilakukan dengan menggunakan dlagent khusus . Saya tidak begitu mengerti kemasan Arch atau bagaimana dlagents bekerja, jadi saya hanya punya jawaban hack, tetapi itu menyelesaikan pekerjaan.

Idenya adalah untuk memodifikasi PKGBUILD untuk menggunakan agen pengunduhan khusus. Saya memodifikasi sumbernya

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

ke

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

dan kemudian mendefinisikan sebuah agen baru yang disebut mygityang melakukan klon dangkal. Saya melakukan ini dengan menambahkan ke DLAGENTSarray di /etc/makepkg.confdlagent berikut:

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

Dugaan saya adalah Anda mungkin dapat mendefinisikan agen unduhan ini di tempat lain, tetapi saya tidak tahu caranya. Perhatikan juga bahwa repositori yang sedang dikloning sulit dikodekan ke dalam perintah. Sekali lagi, ini mungkin bisa dihindari. Akhirnya, lokasi pengunduhan tidak seperti yang diharapkan PKGBUILD. Untuk mengatasinya, saya cukup memindahkan repositori setelah mengunduhnya. Saya melakukan ini dengan menambahkan

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

di awal pkgverfungsi.

Saya pikir solusi yang lebih bersih adalah untuk mencari tahu apa yang git+httpsedang dilakukan dlagent dan mendefinisikan kembali sementara. Ini harus menghindari semua aspek retas dari solusi.

StrongBad
sumber
Terima kasih, ini berhasil. Ya itu akan membutuhkan beberapa pekerjaan untuk abstrak untuk bekerja dalam kasus lain selain yang ini Tetapi perlu diselidiki dan jawaban Anda adalah bukti konsep yang valid. Saya telah mengubah jawaban yang dipilih untuk Anda.
11

Secara pribadi saya memodifikasi skrip makepkg dan itu berfungsi seperti pesona:

# 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"
...

Menambahkan "--mirror --single-branch --depth 1" ke perintah "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"

Ini adalah tampilan diff:

--- 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
marah
sumber
Menginstal softethervpn-git sekarang hanya mengunduh 100M alih-alih 468M sebelum retas.
diredakan
Cemerlang! Terima kasih banyak! Ini harus menjadi default.
ccpizza
Catatan: ini akan gagal dengan PKGBUILD tergantung pada tag misalnya. Lihat diskusi ini . Namun mungkin dapat diperbaiki dengan menggunakan fragmen sana ( branch, tag, commitdll).
BenC
7
Catatan: sekarang /usr/share/makepkg/source/git.shharus ditambal bukan
nponeccop
6

Menurut https://bugs.archlinux.org/task/23065 (kredit ke jasonwryan), menambahkan fungsionalitas kloning dangkal ke AUR PKGBUILD adalah item daftar harapan yang ditutup pada Sabtu, 05 Maret 2011 dengan komentar:

Alasan penutupan: Tidak akan diterapkan

Ini menunjukkan bahwa itu tidak akan terjadi kecuali seseorang mengirimkan tambalan.

Seperti yang saya sarankan kepada poster dalam komentar, apa yang dia coba lakukan hampir pasti dapat dicapai dengan memecah proses menjadi dua langkah:

  1. Klon repositori git menggunakan klon dangkal
  2. Jalankan resep PKGBUILD, tetapi arahkan ke klon lokal. Saya bukan Pengguna Lengkungan, jadi tidak tahu apakah ini masalahnya, tetapi saya akan sangat terkejut dengan sistem pembuatan paket yang memaksa pengguna untuk mengkloning repositori dari jarak jauh untuk membuat paket.
Faheem Mitha
sumber
Terima kasih. Di komentar di tautan, ada diskusi tentang bagaimana modifikasi ini mungkin membawa konsekuensi yang tidak terduga ke alur kerja skrip. Masalahnya adalah bagaimana git mengisi dan menautkan objek yang hilang, dll. - penggunaan disk tidak akan bermanfaat jika saya mengerti dengan benar. Memang saya mencoba melakukan klon dangkal di direktori resep yang akhirnya menjadi 1GB + sama tapi itu diambil oleh makepkg(pkgver mengeluh sedikit tetapi masih) dan bekerja juga!
2

Jika Anda membuat mirror yang dangkal dari repositori di direktori yang sama dengan PKGBUILD, Anda bisa menggunakan makepkg --holdveruntuk mencegah makepkgdari memperbarui sisa repositori. Hal ini menghilangkan kebutuhan untuk memodifikasi PKGBUILD, makepkg.confatau makepkgsendiri; Namun, kloning / memperbarui repositori perlu dilakukan secara manual.

Sebagai contoh dengan cling-git, yang biasanya akan mengkloning keseluruhan llvmdan clang:

$ 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

Dari halaman manual makepkg:

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

Perhatikan bahwa makepkg masih akan mengkloning repo yang belum ada, yang berarti saya bisa menghapus secara manual kloning clingrepositori dalam contoh di atas karena itu tidak begitu besar.

verstatx
sumber
1

Jika Anda tidak ingin memodifikasi skrip makepkg.

seperti diuraikan di sini , titik DEVELSRCDIRdi /etc/yaourtrcatau ~/.yaourtrcberkas untuk beberapa folder persisten. Maka semua pemeriksaan repositori (git / svn / ...) akan terjadi di folder ini. Setelah repositori dikloning, maka hanya pengambilan cepat dengan revisi terbaru yang akan dilakukan alih-alih klon penuh setiap kali.

mzzzzb
sumber