Как изменить 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 справочные страницы - не могу найти, как это сделать.

HalosGhost
источник
«В конце концов мне не удалось успешно построить рецепт». Что вы сделали именно, и что пошло не так? Предоставьте более подробную информацию, пожалуйста. Как кто-то сказал мне в IRC, к сожалению, мы оставили наши хрустальные шары дома. Звучит, читая между строк, как будто репозитории git не удалось успешно клонировать, возможно, из-за проблем с сетью? Но я просто догадываюсь. Будьте явными, пожалуйста.
Фахим Митха
Образованное предположение состоит в том, что вы можете разделить процесс на две части. Сначала клонируйте репозиторий git как мелкий клон или что-то еще Затем примените рецепт. Я предполагаю, что вы могли бы заменить сетевой адрес git+http://github.com/Itseez/opencv.gitв рецепте AUR на локальный путь. Вы пробовали это? Если эта система сборки вынуждает вас клонировать репозитории, даже если она у вас есть в наличии локально, то это чертовски круто.
Фахим Митха
@FaheemMitha Спасибо, я удалил ссылку на ошибку при сборке - мне все равно. Я ищу интегрированное решение, которое могло бы основываться на том, что вы описываете. Я думаю, что может быть возможность не загружать, если есть локальный контент ...
Если ваша основная причина для того, чтобы задать этот вопрос, состоит в том, чтобы избегать использования ненужной пропускной способности / пространства, то это не мешало бы сказать об этом явно. Как я уже сказал, попробуйте просто использовать локальный путь - это, вероятно, будет работать по принципу наименьшего удивления. Если опция для указания мелкого клона не указана на странице руководства, возможно, функциональность недоступна. Я предлагаю спросить на соответствующем форуме Arch, возможно, список рассылки, посвященный этой системе сборки. Сначала уточните, существует ли эта функциональность; если нет, вы можете отправить ошибку в список желаний.
Фахим Митха

Ответы:

13

Это можно сделать с помощью пользовательского dlagent . Я не очень разбираюсь в упаковке Arch или в том, как работают дагенты, поэтому у меня есть только хакерский ответ, но он выполняет свою работу.

Идея состоит в том, чтобы изменить PKGBUILD для использования пользовательского агента загрузки. Я изменил источник

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

в

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

а затем определили новый агент под названием, 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+httpделает драгент, и временно его переработать. Это должно избежать всех аспектов взлома решения.

StrongBad
источник
Спасибо, это работает. Да, потребуется некоторая работа, чтобы абстрагировать ее для работы в других случаях, кроме этого. Но это стоит изучить, и ваш ответ является действительным доказательством концепции. Соответственно, я изменил выбранный ответ на ваш.
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
amized
источник
Установка softethervpn-git теперь загружает только 100M вместо 468M до взлома.
amised
Brilliant! Благодаря тонну! Это должно быть по умолчанию.
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

Из справочных страниц makepkg:

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

Обратите внимание, что makepkg по-прежнему будет клонировать репозитории, которых еще нет, что означает, что я мог бы опустить ручное клонирование clingрепозитория в приведенном выше примере, поскольку он не так велик.

verstatx
источник
1

Если вы не хотите изменять скрипты makepkg.

как описано здесь , точка DEVELSRCDIRв /etc/yaourtrcили ~/.yaourtrcфайл в какой - то постоянной папке. Тогда все проверки хранилища (git / svn / ...) произойдут в этой папке. После того, как репозиторий клонирован, каждый раз будет выполняться только быстрая выборка с новейшими ревизиями вместо полного клонирования.

mzzzzb
источник