Jak zmodyfikować PKGBUILD, który używa źródeł git, aby pobierać tylko płytki klon?


18

Innego dnia próbowałem zainstalować opencv-gitz AUR z makepkgArch Linux. Oczywiście pobiera się z repozytorium git, jak wskazuje nazwa. To pociąga 1 Gb. Czytam o dokonanie płytkie klon z git. Kiedy patrzę na PKGBUILDplik, używając grep git PKGBUILD, widzę:

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"

Czy istnieje sposób na zmodyfikowanie przepisu lub makepkgpolecenia, aby pobrać tylko płytki klon (potrzebuję najnowszej wersji źródła), a nie pełne repozytorium, aby zaoszczędzić miejsce i przepustowość? Czytanie man 5 PKGBUILDnie zapewnia wglądu, którego szukam. Szybko przejrzałem także stronymakepkg i - nie wydaje się, aby znaleźć jak to zrobić.pacman


„W końcu nie udało mi się zbudować przepisu”. Co dokładnie zrobiłeś i co poszło nie tak? Proszę podać więcej szczegółów. Jak ktoś mi kiedyś powiedział na IRC, niestety zostawiliśmy nasze kryształowe kule w domu. Brzmi, czytając między wierszami, jakby repozytorium git nie udało się sklonować, być może z powodu problemów z siecią? Ale tylko zgaduję. Proszę wyraźnie.
Faheem Mitha,

Nauczony zgaduje, że można podzielić proces na dwie części. Najpierw sklonuj repozytorium git jako płytki klon lub cokolwiek innego. Następnie zastosuj przepis. Sądzę, że możesz zastąpić adres sieciowy git+http://github.com/Itseez/opencv.gitw recepturze AUR lokalną nazwą ścieżki. Próbowałeś tego? Jeśli ten system kompilacji zmusi cię do sklonowania repozytoriów, nawet jeśli masz je dostępne lokalnie, to jest to cholernie szalone.
Faheem Mitha,

@FaheemMitha Dziękuję, usunąłem odniesienie do niepowodzenia podczas kompilacji - nie obchodzi mnie to. Szukam zintegrowanego rozwiązania, które mogłoby opierać się na czymś, co opisujesz. Myślę, że może istnieć opcja, aby nie pobierać, jeśli jest zawartość lokalna ...

Jeśli głównym powodem, dla którego zadajesz to pytanie, jest unikanie używania niepotrzebnej przepustowości / przestrzeni, nie zaszkodzi powiedzieć to wprost. Tak jak powiedziałem, spróbuj po prostu skorzystać z lokalnej ścieżki - prawdopodobnie zadziała to zgodnie z zasadą najmniejszego zaskoczenia. Jeśli opcja określania płytkiego klonu nie jest podana na stronie podręcznika, możliwe, że ta funkcja nie jest dostępna. Proponuję zadać pytanie na odpowiednim forum Arch, być może na liście dyskusyjnej poświęconej temu systemowi kompilacji. Najpierw wyjaśnij, czy taka funkcjonalność istnieje; jeśli nie, możesz zgłosić błąd na liście życzeń.
Faheem Mitha,

Odpowiedzi:


13

Można to zrobić za pomocą niestandardowego dlagenta . Naprawdę nie rozumiem pakowania łuku ani tego, jak działają dlagenty, więc mam tylko odpowiedź hacka, ale wykonuje to zadanie.

Chodzi o to, aby zmodyfikować PKGBUILD, aby używał niestandardowego agenta pobierania. Zmodyfikowałem źródło

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

w

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

a następnie zdefiniował nowy dlagent zwany mygitpłytkim klonem. Zrobiłem to, dodając do DLAGENTStablicy /etc/makepkg.confnastępujący tag:

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

Domyślam się, że prawdopodobnie mógłbyś zdefiniować tego agenta pobierania gdzie indziej, ale nie wiem jak. Zauważ również, że klonowane repozytorium jest na stałe zakodowane w poleceniu. Znów można tego prawdopodobnie uniknąć. Wreszcie lokalizacja pobierania nie jest tym, czego oczekuje PKGBUILD. Aby obejść ten problem, po prostu przenoszę repozytorium po pobraniu. Robię to, dodając

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

na początku pkgverfunkcji.

Myślę, że git+httplepszym rozwiązaniem byłoby dowiedzieć się, co robi dlagent, i tymczasowo to zmienić. Powinno to uniknąć wszystkich aspektów hackowania rozwiązania.


Dziękuję, to działa. Tak, potrzeba by trochę pracy, aby ją wyodrębnić, aby działała w innych przypadkach niż ta. Ale warto to zbadać, a twoja odpowiedź jest ważnym dowodem koncepcji. Odpowiednio zmieniłem wybraną odpowiedź na twoją.

11

Osobiście zmodyfikowałem skrypt makepkg i działa on jak urok:

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

Dołączanie „--mirror --single-branch --depth 1” do polecenia „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"

Oto widok różnic:

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

Zainstalowanie softethervpn-git pobiera teraz tylko 100 mln zamiast 468 mln przed włamaniem.
amized

Znakomity! Wielkie dzięki! To powinno być domyślne.
ccpizza

Uwaga: nie powiedzie się to w przypadku PKGBUILD w zależności na przykład od tagu. Zobacz tę dyskusję . Jednakże może być pewnie ustalona przy użyciu fragmentów tam ( branch, tag, commititd.).
BenC

7
Uwaga: teraz /usr/share/makepkg/source/git.shnależy
załatać

6

Według https://bugs.archlinux.org/task/23065 (podziękowania dla jasonwryan) dodanie funkcji płytkiego klonowania do AUR PKGBUILD było pozycją na liście życzeń, która została zamknięta w sobotę, 5 marca 2011 r. Z komentarzem:

Powód zamknięcia: nie zostanie wdrożony

To sugeruje, że tak się nie stanie, chyba że ktoś prześle łatkę.

Jak zasugerowałem w plakacie w komentarzach, to, co próbuje zrobić, prawie na pewno można osiągnąć, dzieląc proces na dwa etapy:

  1. Sklonuj repozytorium git za pomocą płytkiego klonowania
  2. Uruchom przepis PKGBUILD, ale skieruj go na lokalny klon. Nie jestem użytkownikiem Arch, więc nie wiem, czy tak jest, ale byłbym bardzo zaskoczony systemem budowania pakietów, który zmusił użytkowników do klonowania repozytoriów ze zdalnego w celu budowania pakietów.

Dziękuję Ci. W komentarzach w łączu znajduje się dyskusja na temat tego, jak ta modyfikacja mogła przynieść nieoczekiwane konsekwencje dla przepływu pracy skryptu. Problem polega na tym, jak git zapełnia się i łączy brakujące obiekty itp. - użycie dysku nie byłoby korzystne, jeśli dobrze rozumiem. Rzeczywiście próbowałem zrobić płytki klon w katalogu receptur, który skończył się tak samo, jak 1 GB, ale to zostało odebrane przez makepkg(pkgver narzeka lekko, ale nadal) i też działa!

2

Jeśli utworzysz płytkie lustro repozytorium w tym samym katalogu co PKGBUILD, możesz użyć, makepkg --holdveraby uniemożliwić makepkgaktualizację reszty repozytorium. Eliminuje to konieczność modyfikowania PKGBUILD, makepkg.confalbo makepkgsam; klonowanie / aktualizowanie repozytorium należy jednak wykonać ręcznie.

Jako przykład z cling-git , który normalnie sklonowałby całość llvmi 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

Ze stron podręcznika makepkg:

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

Zauważ, że makepkg nadal będzie klonował repozytorium, które nie jest jeszcze obecne, co oznacza, że ​​mogłem pominąć ręczne klonowanie clingrepozytorium w powyższym przykładzie, ponieważ nie jest on tak duży.


1

Jeśli nie chcesz modyfikować skryptów makepkg.

jak opisano tutaj , punkt DEVELSRCDIRw /etc/yaourtrclub ~/.yaourtrcplik do jakiegoś uporczywego folderu. Następnie wszystkie operacje pobierania repozytorium (git / svn / ...) będą miały miejsce w tym folderze. Po sklonowaniu repozytorium będzie wykonywane tylko szybkie pobieranie z najnowszymi wersjami zamiast pełnego klonowania za każdym razem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.