Як змінити PKGBUILD, який використовує джерела git, щоб витягнути лише дрібний клон?


18

Днями я спробував встановити opencv-gitз AUR з 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 сторінки, - не можу знайти, як це зробити.


"Зрештою, я не зміг успішно скласти рецепт". Що ти точно робив, а що пішло не так? Надайте більше деталей, будь ласка. Як хтось мені казав на IRC, ми, на жаль, залишили наші кришталеві кульки вдома. Звучить, читаючи між рядками, ніби git repos не вдалося успішно клонувати, можливо, через проблеми з мережею? Але я просто здогадуюсь. Будьте чіткими, будь ласка.
Faheem Mitha

Освічена здогадка полягає в тому, що ви можете розділити процес на дві частини. Спочатку клонуйте git repos як дрібний клон чи що завгодно. Потім застосуйте рецепт. Я думаю, ви можете замінити мережеву адресу git+http://github.com/Itseez/opencv.gitв рецепті AUR на локальну назву шляху. Ви пробували це? Якщо ця система побудови змушує вас клонувати репост, навіть якщо він у вас є доступним на місцевому рівні, то це досить чудернацький горіх.
Faheem Mitha

@FaheemMitha Дякую, я видалив посилання на збій у збірці - мені все одно. Я шукаю комплексне рішення, яке могло б грунтуватися на чомусь подібному до того, що ви описуєте. Я думаю, може бути варіант не завантажувати, якщо є локальний вміст ...

Якщо ваша головна причина задавати це питання - уникати використання непотрібної пропускної здатності / простору, тоді це не завадить сказати це прямо. Як я вже сказав, спробуйте просто скористатися місцевим шляхом - це, ймовірно, буде працювати за принципом найменшого здивування. Якщо параметр для визначення дрібного клону не вказаний на сторінці людини, можливо, функціональність недоступна. Я пропоную запитати у відповідному форумі Arch, можливо, список розсилки, присвячений цій системі збирання. Спочатку уточнимо, чи існує така функціональність; якщо ні, ви можете подати помилку із списку бажань
Faheem Mitha

Відповіді:


13

Це можна зробити, скориставшись користувацьким длагентом . Я не дуже розумію упаковку Arch або те, як працюють длагенти, тому у мене є лише відповідь на злом, але це робить роботу.

Ідея полягає в тому, щоб змінити PKGBUILD для використання спеціального агента завантаження. Я змінив джерело

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

в

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

а потім визначив новий длагент, mygitякий називається дрібним клоном. Я зробив це, додавши до DLAGENTSмасиву /etc/makepkg.confнаступний дотепний:

'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робить дотепність, і тимчасово уточнити. Це повинно уникати всіх аспектів злому рішення.


Дякую, це працює. Так, знадобиться деяка робота, щоб абстрагувати її, щоб вона працювала в інших випадках, ніж цей. Але варто вивчити, і ваша відповідь є вагомим доказом концепції. Я відповідно змінив обрану відповідь на вашу.

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

Додавання "--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

Встановлення softethervpn-git тепер завантажує 100M замість 468M перед злом.
amized

Блискуче! Дякую тонну! Це має бути за замовчуванням.
ccpizza

Примітка: це не вдасться з PKGBUILD, залежно від тегу, наприклад. Дивіться цю дискусію . Однак це , ймовірно , може бути вирішена з використанням фрагментів там ( branch, tag, і commitт.д.).
BenC

7
Примітка: тепер /usr/share/makepkg/source/git.shзамість цього слід
виправити

6

Згідно з https://bugs.archlinux.org/task/23065 (заслуга Jasonwryan), додавання функцій дрібного клонування AUR PKGBUILD було елементом списку бажань, яке було закрито в суботу, 5 березня 2011 року з коментарем:

Причина закриття: Не реалізується

Це говорить про те, що цього не відбудеться, якщо хтось не подасть виправлення.

Як я запропонував в коментарях до плаката, те, що він намагається зробити, майже напевно можна досягти, розбивши процес на два етапи:

  1. Клоніруйте сховище git, використовуючи дрібний клон
  2. Запустіть рецепт PKGBUILD, але вкажіть його на місцевий клон. Я не користувач Arch, тому не знаю, чи так це, але я був би дуже здивований системою створення пакетів, яка змусила користувачів клонувати сховища віддалено для створення пакетів.

Дякую. У коментарях посилання йде дискусія про те, як ця модифікація могла призвести до несподіваних наслідків для робочого процесу сценарію. Питання полягає в тому, як git заповнює та пов'язує відсутні об'єкти тощо. - Використання диска не буде користю, якщо я правильно розумію. Дійсно, я спробував зробити дрібний клон в каталозі рецептів, який виявився 1 ГБ + те саме, але це було взято makepkg(pkgver скаржиться трохи, але все-таки) і працює теж!

2

Якщо ви зробите неглибоке дзеркало сховища в тому самому каталозі, що і PKGBUILD, ви можете використовувати його makepkg --holdverдля запобігання makepkgоновлення решти сховища. Це усуває необхідність в зміні розміру PKGBUILD, makepkg.confабо makepkgсам по собі; однак клонування / оновлення сховища потрібно робити вручну.

Як приклад cling-git, що, як правило, клонує всю сукупність llvmта 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

Із сторінок mankkg man:

--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 / ...) відбудуться в цій папці. Після того, як репозиторій буде клонований, буде здійснено лише швидке отримання з новітніми редакціями замість повного клонування кожного разу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.