कैसे एक PKGBUILD को संशोधित करने के लिए जो केवल उथले क्लोन को खींचने के लिए गिट स्रोतों का उपयोग करता है?


18

दूसरे दिन मैं स्थापित करने की कोशिश की opencv-gitसे AUR साथ makepkgआर्क लिनक्स पर। बेशक यह गिट रिपोजिटरी से खींचता है जैसा कि नाम से संकेत मिलता है। यह 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 manpages के माध्यम से देखा - पता नहीं कैसे ऐसा करने के लिए कर सकते हैं।


"अंत में मैं नुस्खा का सफलतापूर्वक निर्माण करने में विफल रहा।" आपने वास्तव में क्या किया, और क्या गलत हुआ? अधिक जानकारी प्रदान करें, कृपया। जैसा कि किसी ने एक बार मुझे आईआरसी पर बताया था, दुर्भाग्य से हमने अपने क्रिस्टल गेंदों को घर पर छोड़ दिया। यह लगता है, लाइनों के बीच में पढ़ना, मानो कि git repos सफलतापूर्वक क्लोन करने में विफल रहा है, संभवतः नेटवर्क के मुद्दों के कारण? लेकिन मैं सिर्फ अनुमान लगा रहा हूं। कृपया स्पष्ट रहें।
फहीम मीठा

एक शिक्षित अनुमान यह है कि आप प्रक्रिया को दो भागों में विभाजित कर सकते हैं। सबसे पहले git repos को उथले क्लोन या जो कुछ भी कहते हैं, क्लोन करें। फिर नुस्खा लागू करें। मुझे लगता है कि आप git+http://github.com/Itseez/opencv.gitAUR रेसिपी में नेटवर्क एड्रेस को लोकल पाथनेम से बदल सकते हैं। क्या आपने कोशिश की है? यदि यह बिल्ड सिस्टम आपको स्थानीय स्तर पर उपलब्ध होने पर भी एक रिपॉस क्लोन करने के लिए मजबूर करता है, तो यह बहुत ही भयावह अखरोट है।
फहीम मीठा

@FaheemMitha धन्यवाद, मैंने निर्माण में विफल होने के संदर्भ को हटा दिया है - मुझे परवाह नहीं है। मैं एक एकीकृत समाधान की तलाश में हूं जो आपके द्वारा वर्णित किसी चीज पर आधारित हो सकता है। मुझे लगता है कि स्थानीय सामग्री होने पर डाउनलोड न करने का विकल्प हो सकता है ...

यदि यह प्रश्न पूछने का आपका मुख्य कारण अनावश्यक बैंडविड्थ / स्पेस का उपयोग करने से बचना है, तो यह स्पष्ट रूप से कहने के लिए दुख नहीं होगा। जैसा मैंने कहा, स्थानीय पथ का उपयोग करने का प्रयास करें - यह संभवतः कम से कम आश्चर्य के सिद्धांत से काम करेगा। यदि उथले क्लोन को निर्दिष्ट करने का विकल्प मैन पेज पर नहीं दिया गया है, तो संभव है कि कार्यक्षमता उपलब्ध न हो। मेरा सुझाव है कि एक उपयुक्त आर्क फोरम में पूछें, शायद एक मेलिंग सूची जो उस बिल्ड सिस्टम को समर्पित हो। पहले स्पष्ट करें कि क्या यह कार्यक्षमता मौजूद है; यदि नहीं, तो आप विशलिस्ट बग दर्ज कर सकते हैं।
फहीम मीठा

जवाबों:


13

यह एक कस्टम dlagent का उपयोग करके किया जा सकता है । मुझे वास्तव में आर्क पैकेजिंग या डलागेंट्स कैसे काम करते हैं, यह समझ में नहीं आता है, इसलिए मेरे पास केवल एक हैक जवाब है, लेकिन यह काम पूरा करता है।

कस्टम डाउनलोड एजेंट का उपयोग करने के लिए PKGBUILD को संशोधित करने का विचार है। मैंने स्रोत को संशोधित किया

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

में

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

और फिर एक नई dlagent कहा जाता है 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

व्यक्तिगत रूप से मैंने मेकपैक स्क्रिप्ट को संशोधित किया और यह एक आकर्षण की तरह काम कर रहा है:

# 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 क्लोन" कमांड के लिए "--mirror --single-Branch --depth 1" को लागू करना:

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

सॉफ्टएथर्वन-गिट स्थापित करने से अब हैक से पहले केवल 468M के बजाय 100M डाउनलोड होता है।
amized

प्रतिभाशाली! अनेक अनेक धन्यवाद! यह डिफ़ॉल्ट होना चाहिए।
ccpizza

नोट: यह उदाहरण के लिए टैग के आधार पर PKGBUILDs के साथ विफल हो जाएगा। इस चर्चा को देखें । हालांकि यह शायद (वहाँ टुकड़े का उपयोग करके ठीक किया जा सकता branch, tag, commitआदि)।
BenC

7
नोट: अब /usr/share/makepkg/source/git.shइसके बजाय पैच किया जाना चाहिए
nponeccop

6

के अनुसार https://bugs.archlinux.org/task/23065 (jasonwryan को ऋण), AUR PKGBUILD उथले क्लोनिंग कार्यक्षमता जोड़ने एक इच्छा सूची आइटम है कि शनिवार को बंद हो गया, 05 मार्च 2011 टिप्पणी के साथ किया गया था:

बंद करने का कारण: लागू नहीं होगा

इससे पता चलता है कि यह तब तक नहीं होने वाला है जब तक कोई पैच को जमा नहीं करता है।

जैसा कि मैंने टिप्पणियों में पोस्टर को सुझाव दिया है, वह जो करने की कोशिश कर रहा है वह लगभग निश्चित रूप से प्रक्रिया को दो चरणों में तोड़कर पूरा किया जा सकता है:

  1. उथले क्लोन का उपयोग करके गिट रिपॉजिटरी को क्लोन करें
  2. PKGBUILD नुस्खा चलाएं, लेकिन इसे स्थानीय क्लोन पर इंगित करें। मैं एक आर्क उपयोगकर्ता नहीं हूं, इसलिए यह नहीं जानता कि क्या यह मामला है, लेकिन मैं एक पैकेज बिल्डिंग सिस्टम पर बहुत आश्चर्यचकित होऊंगा जिसने उपयोगकर्ताओं को संकुल बनाने के लिए रिमोट से रिपॉजिटरी क्लोन करने के लिए मजबूर किया।

धन्यवाद। लिंक में टिप्पणियों में, इस चर्चा के बारे में है कि यह संशोधन स्क्रिप्ट वर्कफ़्लो में अप्रत्याशित परिणाम कैसे ला सकता है। मुद्दा यह है कि कैसे गिट पॉप्युलेट करता है और गायब वस्तुओं आदि को जोड़ता है - अगर मैं सही तरीके से समझूं तो डिस्क का उपयोग करना एक लाभ नहीं होगा। वास्तव में मैंने नुस्खा निर्देशिका में एक उथले क्लोन बनाने की कोशिश की, जो 1GB + समान होने पर समाप्त हो गई, लेकिन इसे उठाया गया था makepkg(pkgver थोड़ा शिकायत करता है लेकिन फिर भी) और काम करता है!

2

यदि आप उसी निर्देशिका में रिपॉजिटरी का उथला दर्पण बनाते हैं PKGBUILD, तो आप बाकी रिपॉजिटरी को अपडेट करने से makepkg --holdverरोकने के लिए उपयोग कर सकते हैं makepkg। यह , या PKGBUILD, को संशोधित करने की आवश्यकता को हटाता हैmakepkg.confmakepkg खुद को; हालाँकि, रिपॉजिटरी को क्लोनिंग / अपडेट करना मैन्युअल रूप से करने की आवश्यकता है।

एक उदाहरण के रूप में 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.

ध्यान दें कि मेकपैक अभी भी रेपो क्लोन करेगा जो पहले से मौजूद नहीं हैं, जिसका मतलब है कि मैं clingउपरोक्त उदाहरण में रिपॉजिटरी को मैन्युअल रूप से क्लोन कर सकता है क्योंकि यह इतना बड़ा नहीं है।


1

यदि आप मेकपैक स्क्रिप्ट को संशोधित नहीं करना चाहते हैं।

जैसा कि यहां बताया गया है , कुछ स्थिर फ़ोल्डर DEVELSRCDIRमें इंगित करें/etc/yaourtrc या ~/.yaourtrcफ़ाइल करें। फिर सभी रिपॉजिटरी चेकआउट (git / svn / ...) इस फ़ोल्डर में होगा। एक बार जब रिपॉजिटरी को क्लोन किया जाता है, तो हर बार पूर्ण क्लोन के बजाय केवल नए संशोधन के साथ त्वरित भ्रूण का प्रदर्शन किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.