Wie ändere ich ein PKGBUILD, das Git-Quellen verwendet, um nur einen flachen Klon zu ziehen?

18

Neulich habe ich versucht, opencv-gitvon der AUR mit makepkgauf Arch Linux zu installieren . Natürlich wird es aus dem Git- Repository gezogen, wie der Name schon sagt. Dies zieht 1 GB. Ich lese über eine Herstellung flache Klon mit git. Wenn ich die PKGBUILDDatei mit anschaue grep git PKGBUILD, sehe ich:

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"

Gibt es eine Möglichkeit, das Rezept oder den makepkgBefehl so zu ändern , dass nur ein flacher Klon abgerufen wird (die neueste Version der Quelle ist das, was ich möchte), und nicht das vollständige Repository, um Speicherplatz und Bandbreite zu sparen? Das Lesen man 5 PKGBUILDliefert nicht die Einsicht, nach der ich suche. Schaute auch schnell durch die Hilfeseitenmakepkg und - kann anscheinend nicht herausfinden, wie das geht.pacman

HalosGhost
quelle
"Am Ende habe ich es nicht geschafft, das Rezept erfolgreich zu erstellen." Was hast du genau gemacht und was ist schief gelaufen? Bitte machen Sie nähere Angaben. Wie mir mal jemand im IRC erzählt hat, haben wir leider unsere Kristallkugeln zu Hause gelassen. Es hört sich beim Lesen zwischen den Zeilen so an, als ob das Klonen der Git-Repos fehlgeschlagen wäre, möglicherweise aufgrund von Netzwerkproblemen. Aber ich rate nur. Seien Sie bitte ausdrücklich.
Faheem Mitha
Eine fundierte Vermutung ist, dass Sie den Prozess in zwei Teile aufteilen können. Klonen Sie zuerst die Git-Repos als flachen Klon oder was auch immer. Dann wenden Sie das Rezept an. Ich vermute, Sie könnten die Netzwerkadresse git+http://github.com/Itseez/opencv.gitim AUR-Rezept durch einen lokalen Pfadnamen ersetzen . Hast du das versucht? Wenn dieses Build-System Sie zwingt, ein Repo zu klonen, auch wenn es lokal verfügbar ist, dann ist es verdammt verrückt.
Faheem Mitha
@FaheemMitha Danke, ich habe den Verweis auf Fehler beim Erstellen entfernt - es ist mir egal. Ich suche nach einer integrierten Lösung, die auf etwas basiert, was Sie beschreiben. Ich denke, es könnte eine Option geben, nicht herunterzuladen, wenn es lokalen Inhalt gibt ...
Wenn Ihr Hauptgrund für die Beantwortung dieser Frage die Vermeidung unnötiger Bandbreite / unnötigen Speicherplatzes ist, würde es nicht schaden, dies ausdrücklich zu sagen. Versuchen Sie, wie gesagt, einfach den lokalen Pfad zu verwenden - dies funktioniert wahrscheinlich nach dem Prinzip der geringsten Überraschung. Wenn die Option zum Angeben eines flachen Klons auf der Manpage nicht angegeben ist, ist möglicherweise keine Funktionalität verfügbar. Ich schlage vor, in einem geeigneten Arch-Forum nachzufragen, vielleicht einer Mailing-Liste, die diesem Build-System gewidmet ist. Stellen Sie zunächst klar, ob diese Funktionalität vorhanden ist. Wenn nicht, können Sie einen Fehler in der Wunschliste melden.
Faheem Mitha

Antworten:

13

Dies kann mit einem benutzerdefinierten Dlagent erfolgen . Ich verstehe die Arch-Verpackung oder die Funktionsweise der Dlagents nicht wirklich, daher habe ich nur eine Hack-Antwort, aber sie erledigt den Job.

Die Idee ist, PKGBUILD so zu ändern, dass ein benutzerdefinierter Download-Agent verwendet wird. Ich habe die Quelle geändert

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

in

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

und definierte dann einen neuen Dlagent, mygitder einen flachen Klon ausführt . Ich tat dies, indem ich dem DLAGENTSArray im /etc/makepkg.conffolgenden Dlagent hinzufügte:

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

Vermutlich könnten Sie diesen Download-Agenten an einer anderen Stelle definieren, aber ich weiß nicht, wie. Beachten Sie auch, dass das Repository, das geklont wird, im Befehl fest codiert ist. Auch dies kann wahrscheinlich vermieden werden. Schließlich entspricht der Download-Speicherort nicht den Erwartungen von PKGBUILD. Um dies zu umgehen, verschiebe ich einfach das Repository, nachdem ich es heruntergeladen habe. Ich mache das durch Hinzufügen

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

am Anfang der pkgverFunktion.

Ich denke, die sauberere Lösung wäre, herauszufinden, was der git+httpDlagent tut, und dies vorübergehend neu zu definieren. Dies sollte alle Hack-Aspekte der Lösung vermeiden.

StrongBad
quelle
Danke, das funktioniert. Ja, es würde einige Arbeit erfordern, um es zu abstrahieren, damit es in anderen Fällen als diesem funktioniert. Aber es lohnt sich zu untersuchen und Ihre Antwort ist ein gültiger Proof of Concept. Ich habe die ausgewählte Antwort entsprechend auf Ihre geändert.
11

Persönlich habe ich das makepkg-Skript modifiziert und es funktioniert wie ein Zauber:

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

Fügen Sie "--mirror --single-branch --depth 1" an den Befehl "git clone" an:

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"

Hier ist eine Diff-Ansicht:

--- 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
quelle
Bei der Installation von softethervpn-git werden jetzt nur 100 MB anstatt 468 MB vor dem Hack heruntergeladen.
Am
Brillant! Danke vielmals! Dies sollte die Standardeinstellung sein.
ccpizza
Hinweis: Dies schlägt bei PKGBUILDs beispielsweise in Abhängigkeit von einem Tag fehl. Siehe diese Diskussion . Allerdings kann es wahrscheinlich durch die Verwendung der Fragmente dort fixiert werden ( branch, tag, commitetc.).
BenC
7
Hinweis: Jetzt /usr/share/makepkg/source/git.shsollte stattdessen ein
Patch installiert werden
6

Laut https://bugs.archlinux.org/task/23065 (Dank an jasonwryan) war das Hinzufügen von Funktionen für das flache Klonen zu AUR PKGBUILD ein Wunschzettel, der am Samstag, dem 5. März 2011, mit dem folgenden Kommentar geschlossen wurde:

Grund für das Schließen: Wird nicht implementiert

Dies deutet darauf hin, dass dies nur dann geschehen wird, wenn jemand einen Patch einreicht.

Wie ich in Kommentaren zum Poster angedeutet habe, kann das, was er versucht, mit ziemlicher Sicherheit erreicht werden, indem der Prozess in zwei Schritte unterteilt wird:

  1. Klonen Sie das Git-Repository mit dem flachen Klon
  2. Führen Sie das PKGBUILD-Rezept aus, aber zeigen Sie es auf den lokalen Klon. Ich bin kein Arch-Benutzer, weiß also nicht, ob dies der Fall ist, aber ich wäre sehr überrascht über ein Paketerstellungssystem, das Benutzer dazu zwang, Repositorys von einem entfernten Standort aus zu klonen, um Pakete zu erstellen.
Faheem Mitha
quelle
Vielen Dank. In den Kommentaren im Link wird diskutiert, wie diese Änderung zu unerwarteten Konsequenzen für den Skript-Workflow führen könnte. Das Problem ist, wie Git fehlende Objekte usw. bevölkert und verknüpft. Wenn ich das richtig verstehe, wäre die Datenträgernutzung kein Vorteil. In der Tat habe ich versucht, einen flachen Klon im Rezeptverzeichnis zu makepkgerstellen, der am Ende 1 GB + war, aber der wurde von (pkgver beschwert sich leicht, aber immer noch) aufgenommen und funktioniert auch!
2

Wenn Sie eine flache Spiegelung des Repositorys in demselben Verzeichnis wie das PKGBUILDerstellen, können Sie makepkg --holdververhindern, dass makepkgder Rest des Repositorys aktualisiert wird. Dadurch entfällt die Notwendigkeit zu ändern , die PKGBUILD, makepkg.confoder makepkgselbst; Das Klonen / Aktualisieren des Repositorys muss jedoch manuell erfolgen.

Als Beispiel mit cling-git, das normalerweise die Gesamtheit von llvmund klonen würde 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

Aus den makepkg-Manpages:

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

Beachten Sie, dass makepkg immer noch Repos klont, die noch nicht vorhanden sind. Das bedeutet, dass ich clingim obigen Beispiel auf das manuelle Klonen des Repositorys hätte verzichten können, da es nicht so groß ist.

verstatx
quelle
1

Wenn Sie makepkg-Skripte nicht ändern möchten.

Zeigen Sie , wie hier beschrieben , DEVELSRCDIRin einen dauerhaften Ordner /etc/yaourtrcoder ~/.yaourtrclegen Sie ihn ab. Dann werden alle Auscheckvorgänge im Repository (git / svn / ...) in diesem Ordner ausgeführt. Sobald das Repository geklont ist, wird anstelle des vollständigen Klons jedes Mal nur der Schnellabruf mit den neuesten Revisionen durchgeführt.

mzzzzb
quelle