วิธีการแก้ไข 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 manpages - ดูเหมือนจะไม่สามารถหาวิธีที่จะทำ


"ในที่สุดฉันก็ล้มเหลวในการสร้างสูตรสำเร็จ" คุณทำอะไรกันแน่และมีอะไรผิดพลาด? โปรดระบุรายละเอียดเพิ่มเติม ในฐานะที่มีคนเคยบอกฉันเกี่ยวกับ IRC แต่น่าเสียดายที่เราทิ้งลูกบอลคริสตัลไว้ที่บ้าน มันฟังดูอ่านระหว่างบรรทัดราวกับว่า repos git ล้มเหลวในการประสบความสำเร็จอาจเป็นเพราะปัญหาเครือข่าย? แต่ฉันแค่คาดเดา โปรดระบุให้ชัดเจน
Faheem Mitha

การเดาที่มีการศึกษาคือคุณสามารถแยกกระบวนการออกเป็นสองส่วน ก่อนอื่นเลียนแบบคอมไพล์ git เป็นโคลนตื้น ๆ หรืออะไรก็ตาม จากนั้นใช้สูตร ฉันเดาว่าคุณสามารถแทนที่ที่อยู่เครือข่ายgit+http://github.com/Itseez/opencv.gitในสูตร AUR ด้วยชื่อพา ธ ท้องถิ่น คุณเคยลองไหม หากระบบการสร้างนี้บังคับให้คุณโคลน repos แม้ว่าคุณจะมีมันอยู่ในเครื่องแล้วมันก็เป็นสิ่งที่เลว
Faheem Mitha

@FaheemMitha ขอบคุณฉันได้ลบการอ้างอิงถึงความล้มเหลวในการสร้าง - ฉันไม่สนใจ ฉันกำลังมองหาวิธีการแก้ปัญหาแบบบูรณาการที่อาจขึ้นอยู่กับสิ่งที่คุณอธิบาย ฉันคิดว่าอาจมีตัวเลือกให้ไม่ดาวน์โหลดหากมีเนื้อหาในพื้นที่ ...

หากเหตุผลหลักของคุณในการถามคำถามนี้คือการหลีกเลี่ยงการใช้แบนด์วิดท์ / ช่องว่างที่ไม่จำเป็นมันจะไม่เจ็บที่จะพูดอย่างชัดเจน อย่างที่ฉันบอกให้ลองใช้เส้นทางในท้องที่ซึ่งอาจเป็นไปได้ด้วยหลักการของความประหลาดใจน้อยที่สุด หากไม่มีตัวเลือกในการระบุโคลนตื้นในหน้าคนเป็นไปได้ว่าฟังก์ชันการทำงานนั้นไม่พร้อมใช้งาน ฉันขอแนะนำให้ถามในฟอรัม Arch ที่เหมาะสมบางทีอาจเป็นรายชื่อผู้รับจดหมายที่อุทิศให้กับระบบบิลด์นั้น ก่อนอื่นชี้แจงว่าฟังก์ชั่นนั้นมีอยู่หรือไม่; ถ้าไม่คุณสามารถยื่นบั๊กสิ่งที่ปรารถนา
Faheem Mitha

คำตอบ:


13

ซึ่งสามารถทำได้โดยใช้กำหนดเองdlagent ฉันไม่เข้าใจว่าบรรจุภัณฑ์ของ Arch หรือวิธีการทำงานของ dlagents ดังนั้นฉันจึงมีเพียงคำตอบของการแฮ็ก แต่มันก็ทำให้งานเสร็จ

แนวคิดคือการแก้ไข PKGBUILD เพื่อใช้ตัวแทนการดาวน์โหลดที่กำหนดเอง ฉันแก้ไขแหล่งที่มา

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

เข้าไป

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

และจากนั้นจึงกำหนด dlagent ใหม่ที่เรียกว่า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กว่าคือการหาว่า dlagent กำลังทำอะไรอยู่และแก้ไขใหม่ชั่วคราว สิ่งนี้ควรหลีกเลี่ยงการแฮ็กข้อมูลทั้งหมดของโซลูชัน


ขอบคุณมันใช้งานได้ ใช่มันจะต้องมีงานที่จะทำให้มันเป็นนามธรรมในการทำงานในกรณีอื่นนอกเหนือจากนี้ แต่มันก็คุ้มค่าที่จะตรวจสอบและคำตอบของคุณก็เป็นข้อพิสูจน์แนวคิดที่ถูกต้อง ฉันได้เปลี่ยนคำตอบที่เลือกให้กับคุณ

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

การติดตั้ง softethervpn-git ตอนนี้จะดาวน์โหลด 100M เท่านั้นแทนที่จะเป็น 468M ก่อนการแฮ็ก
แก้ไข

ยอดเยี่ยม! ขอบคุณตัน! นี่ควรเป็นค่าเริ่มต้น
ccpizza

หมายเหตุ: สิ่งนี้จะล้มเหลวด้วย PKGBUILD ขึ้นอยู่กับแท็กเช่น ดูการสนทนานี้ แต่มันอาจจะสามารถได้รับการแก้ไขโดยใช้ชิ้นส่วนที่มี ( branch, tag, commitฯลฯ )
BenC

7
หมายเหตุ: ตอนนี้/usr/share/makepkg/source/git.shควรได้รับการแก้ไขแทน
nponeccop

6

ตามhttps://bugs.archlinux.org/task/23065 (เครดิตให้กับ jasonwryan) การเพิ่มฟังก์ชั่นการโคลนนิ่งตื้น ๆ ให้กับ AUR PKGBUILD เป็นรายการสิ่งที่อยากได้ที่ถูกปิดเมื่อวันเสาร์ที่ 5 มีนาคม 2011 ด้วยความคิดเห็น:

เหตุผลที่ปิด: จะไม่ใช้

สิ่งนี้ชี้ให้เห็นว่ามันจะไม่เกิดขึ้นถ้ามีคนส่งแพทช์

ตามที่ฉันแนะนำให้ผู้โพสต์ในความคิดเห็นสิ่งที่เขาพยายามทำสามารถทำได้โดยการแบ่งกระบวนการออกเป็นสองขั้นตอน:

  1. โคลนที่เก็บ git โดยใช้โคลนตื้น
  2. เรียกใช้สูตร PKGBUILD แต่ชี้ไปที่โคลนโลคัล ฉันไม่ใช่ผู้ใช้ Arch ดังนั้นไม่ทราบว่าเป็นกรณีนี้หรือไม่ แต่ฉันแปลกใจมากที่ระบบสร้างแพ็คเกจที่บังคับให้ผู้ใช้โคลนที่เก็บจากระยะไกลเพื่อสร้างแพ็คเกจ

ขอขอบคุณ. ในความคิดเห็นในลิงค์มีการสนทนาเกี่ยวกับวิธีการปรับเปลี่ยนนี้อาจทำให้เกิดผลที่ไม่คาดคิดต่อเวิร์กโฟลว์สคริปต์ ปัญหาคือวิธีการใส่ git และเชื่อมโยงวัตถุที่หายไป ฯลฯ - การใช้ดิสก์จะไม่เป็นประโยชน์ถ้าฉันเข้าใจอย่างถูกต้อง จริง ๆ แล้วฉันพยายามทำโคลนแบบตื้นในไดเรกทอรีสูตรซึ่งลงท้ายด้วย 1GB + เหมือนกัน แต่ถูกเลือกโดย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 จะยังคงโคลน repos ที่ไม่ได้มีอยู่ซึ่งหมายความว่าฉันไม่ได้ทำการโคลนที่clingเก็บด้วยตนเองในตัวอย่างด้านบนเนื่องจากมันมีขนาดไม่ใหญ่นัก


1

หากคุณไม่ต้องการแก้ไขสคริปต์ makepkg

ตามที่ระบุไว้ที่นี่จุดDEVELSRCDIRใน/etc/yaourtrcหรือ~/.yaourtrcไฟล์ไปยังโฟลเดอร์ถาวรบาง จากนั้นที่เก็บเช็คเอาต์ทั้งหมด (git / svn / ... ) จะเกิดขึ้นในโฟลเดอร์นี้ เมื่อโคลนที่เก็บข้อมูลแล้วการดึงข้อมูลอย่างรวดเร็วด้วยการแก้ไขล่าสุดจะดำเนินการแทนการโคลนแบบเต็มในแต่ละครั้ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.