Sadece sığ bir klonu çekmek için git kaynaklarını kullanan bir PKGBUILD nasıl değiştirilir?


18

Geçen gün ben yüklemeden çalıştı opencv-gitdan AUR ile makepkgArch Linux üzerinde. Tabii ki adından da anlaşılacağı gibi git deposundan çıkar. Bu 1Gb çeker. Bir yapma konusunda okuyorum sığ klon ile git. PKGBUILDDosyaya baktığımda grep git PKGBUILDşunu görüyorum:

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"

makepkgAlan veya bant genişliğinden tasarruf etmek için tam depoyu değil, sadece sığ bir klonu (kaynağın en son sürümü istediğim şey) çekme komutunu veya komutu değiştirmenin bir yolu var mı ? Okuma man 5 PKGBUILD, aradığım bilgiyi sağlamaz. Ayrıca hızla makepkgve pacman manpages baktı - nasıl yapılacağını bulamıyorum.


"Sonunda başarılı bir şekilde tarifi hazırlayamadım." Tam olarak ne yaptın ve neyin yanlış gitti? Daha fazla ayrıntı verin, lütfen. Birinin bana IRC'de söylediği gibi, maalesef kristal toplarımızı evde bıraktık. Görünüşe göre, satırlar arasındaki okuma, git depoları muhtemelen ağ sorunları nedeniyle başarılı bir şekilde klonlanamadı mı? Ama sadece tahmin ediyorum. Açık olun, lütfen.
Faheem Mitha

Eğitimli bir tahmin, süreci iki parçaya ayırabileceğinizdir. Önce git depolarını sığ bir klon ya da başka bir şey olarak klonlayın. Sonra tarifi uygulayın. git+http://github.com/Itseez/opencv.gitAUR tarifindeki ağ adresini yerel bir yol adıyla değiştirebilirsiniz. Bunu denedin mi? Bu yapı sistemi, yerel olarak kullanılabilir olsanız bile bir depoları klonlamaya zorlarsa, oldukça çılgınca bir çılgınlıktır.
Faheem Mitha

@FaheemMitha Teşekkür ederim, derleme başarısız başvurusu kaldırdım - Umrumda değil. Açıkladığınız gibi bir şeye dayanan entegre bir çözüm arıyorum. Yerel içerik varsa indirmek için bir seçenek olabilir düşünüyorum ...

Bu soruyu sormanın ana sebebi gereksiz bant genişliği / boşluk kullanmaktan kaçınmaksa, bu kadar açık bir şekilde söylemek zarar vermez. Dediğim gibi, sadece yerel yolu kullanmayı deneyin - bu muhtemelen en az sürpriz ilkesi ile çalışacaktır. Man sayfasında sığ bir klon belirtme seçeneği belirtilmemişse, işlevsellik mevcut olmayabilir. Uygun bir Arch forumunu, belki de bu yapı sistemine adanmış bir posta listesini istemenizi öneririm. Öncelikle bu işlevin var olup olmadığını netleştirin; değilse, bir istek listesi hatası dosyalayabilirsiniz.
Faheem Mitha

Yanıtlar:


13

Bu, özel bir cüruf kullanılarak yapılabilir . Arch ambalajını veya cürufların nasıl çalıştığını gerçekten anlamıyorum, bu yüzden sadece hack cevabım var, ama işi hallediyor.

Fikir, özel bir indirme aracısı kullanmak için PKGBUILD'yi değiştirmektir. Kaynağı değiştirdim

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

içine

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

ve sonra mygitsığ bir klon yapan yeni bir cüruf tanımladı . Bunu aşağıdaki cüruf DLAGENTSdiziye ekleyerek yaptım /etc/makepkg.conf:

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

Tahminimce bu indirme aracısını başka bir yerde tanımlayabilirsiniz, ancak nasıl yapacağımı bilmiyorum. Ayrıca klonlanan deponun komutun içine sabit kodlanmış olduğuna dikkat edin. Yine, bu muhtemelen önlenebilir. Son olarak, indirme konumu PKGBUILD'nin beklediği gibi değildir. Bu sorunu gidermek için, depoyu indirdikten sonra hareket ettiriyorum. Bunu ekleyerek yaparım

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

pkgverfonksiyonun başında .

Bence daha temiz çözüm, git+httpcürufun ne yaptığını bulmak ve bunu geçici olarak yeniden yapmak olacaktır. Bu, çözümün tüm hack yönlerinden kaçınmalıdır.


Teşekkür ederim, bu işe yarıyor. Evet, bunun dışındaki durumlarda çalışabilmesi için soyutlanması gereken bir çalışma gerekir. Ancak araştırmaya değer ve cevabınız geçerli bir kavram kanıtıdır. Buna göre seçilen cevabı sizinkine değiştirdim.

11

Şahsen makepkg betiğini değiştirdim ve bir cazibe gibi çalışıyor:

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

"Git clone" komutuna "--mirror --single-branch --depth 1" ekleniyor:

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"

Farklı bir görünüm:

--- 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 kurulumu artık saldırıdan önce 468M yerine yalnızca 100M indiriyor.
15'te amize

Parlak! Bir ton teşekkürler! Bu varsayılan değer olmalıdır.
ccpizza

Not: örneğin bir etikete bağlı olarak PKGBUILD'lerde başarısız olur. Bu tartışmaya bakın . Bununla birlikte, muhtemelen (var fragmanları kullanılarak tespit edilebilir branch, tag, commitvb.)
BenC

7
Not: şimdi /usr/share/makepkg/source/git.shonun yerine yamalı
nponeccop

6

Göre https://bugs.archlinux.org/task/23065 (jasonwryan kredi), AUR PKGBUILD sığ klonlama işlevleri ekleyerek Cumartesi günü kapatıldığı bir dilek madde, yorum ile 5 Mart 2011 idi:

Kapanma nedeni: Uygulanmayacak

Bu, birisi yama göndermediği sürece gerçekleşmeyeceğini gösterir.

Yorumlarda postere önerdiğim gibi, yapmaya çalıştığı şey, süreci kesinlikle iki adıma ayırarak neredeyse başarılabilir:

  1. Git deposunu sığ klon kullanarak klonlayın
  2. PKGBUILD tarifini çalıştırın, ancak yerel klonun üzerine getirin. Ben bir Arch kullanıcısı değilim, bu yüzden durumun böyle olup olmadığını bilmiyorum, ancak paketleri oluşturmak için kullanıcıları uzaktan depoları klonlamaya zorlayan bir paket oluşturma sisteminde çok şaşırırdım.

Teşekkür ederim. Bağlantıdaki yorumlarda, bu değişikliğin komut dosyası iş akışına nasıl beklenmedik sonuçlar getirebileceği hakkında bu tartışma var. Sorun, git'in eksik nesneleri vb. Gerçekten de 1GB + aynı sona erdi ama makepkg(pkgver biraz ama yine de şikayet ediyor) tarafından aldı ve çok çalışıyor tarifi dizininde sığ bir klon yapmaya çalıştım !

2

Deponun ile aynı dizinde sığ bir ayna PKGBUILDyaparsanız , deponun geri kalanını güncellemeyi makepkg --holdverönlemek için kullanabilirsiniz makepkg. Bu değiştirme gereğini ortadan kaldırır PKGBUILD, makepkg.confya da makepkgkendisi; ancak deponun klonlanması / güncellenmesi manuel olarak yapılmalıdır.

Bir örnek olarak cling-git, normal olarak tamamını klonlamak olur, llvmve 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 man sayfalarından:

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

Makepkg'ın hâlihazırda mevcut olmayan depoları yine de klonlayacağına dikkat edin; bu, clingçok büyük olmadığı için yukarıdaki örnekte havuzu manuel olarak klonlamayı atlayabileceğim anlamına gelir .


1

Makepkg komut dosyalarını değiştirmek istemiyorsanız.

özetlendiği gibi burada , nokta DEVELSRCDIRhalinde /etc/yaourtrcveya ~/.yaourtrcdosya bazı kalıcı klasöre. Sonra bu depoda tüm depo kontrolleri (git / svn / ...) gerçekleşir. Havuz klonlandıktan sonra, her seferinde tam klon yerine yalnızca en yeni revizyonlarla hızlı getirme gerçekleştirilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.