자식 소스를 사용하여 얕은 클론 만 가져 오는 PKGBUILD를 수정하는 방법은 무엇입니까?


18

일전에 내가 설치 시도 opencv-git로부터 AURmakepkg아치 리눅스에. 물론 이름에서 알 수 있듯이 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 - 그 작업을 수행하는 방법을 찾을 수 없습니다.


"결국 나는 레시피를 성공적으로 구축하지 못했습니다." 정확히 무엇을했고, 무엇이 잘못 되었습니까? 자세한 내용을 알려주십시오. 누군가 IRC에 대해 한 번 말해 본 것처럼 불행히도 우리는 수정 구슬을 집에 남겨 두었습니다. 네트워크 문제로 인해 git repos가 성공적으로 복제되지 않은 것처럼 라인 사이에서 읽히는 소리가납니다. 그러나 나는 단지 추측하고있다. 명시하십시오.
Faheem Mitha

교육받은 추측은 프로세스를 두 부분으로 나눌 수 있다는 것입니다. 먼저 자식 저장소를 얕은 복제본으로 복제하십시오. 그런 다음 레시피를 적용하십시오. git+http://github.com/Itseez/opencv.gitAUR 레시피 의 네트워크 주소 를 로컬 경로 이름으로 바꿀 수 있다고 생각합니다 . 당신은 그것을 시도 했습니까? 이 빌드 시스템이 로컬에서 사용할 수 있다고해도 repos를 복제하도록 강요하면 꽤 까다 롭습니다.
Faheem Mitha

@FaheemMitha 감사합니다. 빌드 실패에 대한 참조를 제거했습니다. 나는 당신이 묘사 한 것과 같은 것을 기반으로 할 수있는 통합 솔루션을 찾고 있습니다. 로컬 컨텐츠가있는 경우 다운로드하지 않는 옵션이있을 수 있습니다 ...

이 질문을하는 주된 이유가 불필요한 대역폭 / 공간 사용을 피하는 것이기 때문에 그렇게 명시 적으로 말하는 것이 아프지 않을 것입니다. 내가 말했듯이, 로컬 경로를 사용하십시오. 이것은 아마도 가장 놀랍지 않은 원리로 작동 할 것입니다. 얕은 페이지를 지정하는 옵션이 매뉴얼 페이지에 제공되지 않으면 기능을 사용하지 못할 수 있습니다. 적절한 아치 포럼 (아마도 해당 빌드 시스템 전용 메일 링리스트)을 요청하는 것이 좋습니다. 먼저 해당 기능이 존재하는지 확인하십시오. 그렇지 않으면 위시리스트 버그를 제기 할 수 있습니다.
Faheem Mitha

답변:


13

이것은 사용자 정의 dlagent 를 사용하여 수행 할 수 있습니다 . 나는 아치 패키징이나 dlagents의 작동 방식을 실제로 이해하지 못하기 때문에 해킹에 대한 답변 만 가지고 있지만 작업이 완료됩니다.

사용자 정의 다운로드 에이전트를 사용하도록 PKGBUILD를 수정하는 것이 좋습니다. 소스를 수정했습니다

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

으로

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

그런 다음 mygit얕은 클론을 수행하는 새로운 dlagent를 정의했습니다 . 다음 dlagent 의 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+httpdlagent 가하는 일을 파악하고 일시적으로 재정의하는 것입니다. 이것은 솔루션의 모든 해킹 측면을 피해야합니다.


감사합니다. 그렇습니다.이 경우가 아닌 다른 경우에 작동하려면 추상화해야합니다. 그러나 조사 할 가치가 있으며 귀하의 답변은 유효한 개념 증명입니다. 따라서 선택한 답변을 귀하의 답변으로 변경했습니다.

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

"git clone"명령에 "--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

softethervpn-git을 설치하면 해킹 전에 468M 대신 100M 만 다운로드합니다.
amized

훌륭한! 엄청 고마워! 이것이 기본값이어야합니다.
ccpizza

참고 : 예를 들어 태그에 따라 PKGBUILD에서는 실패합니다. 이 토론을 참조하십시오 . 그러나 아마도 (이 단편을 사용하여 고정 될 수있다 branch, tag, commit등).
BenC

7
참고 : 이제 /usr/share/makepkg/source/git.sh대신 패치해야합니다
nponeccop

6

https://bugs.archlinux.org/task/23065 (jasonwryan의 신용) 에 따르면 AUR PKGBUILD에 얕은 복제 기능을 추가하는 것은 2011 년 3 월 5 일 토요일에 마감 된 위시리스트 항목이었습니다.

폐쇄 사유 : 구현하지 않음

이것은 누군가 패치를 제출하지 않으면 일어날 수 없음을 나타냅니다.

내가 포스터에 의견을 제안한 것처럼, 그가하려고하는 일은 프로세스를 두 단계로 나눔으로써 거의 확실하게 달성 할 수 있습니다.

  1. 얕은 클론을 사용하여 자식 저장소 복제
  2. PKGBUILD 레시피를 실행하되 로컬 클론을 가리 킵니다. 나는 아치 사용자가 아니므로 이것이 사실인지 모르겠지만 패키지 빌드 시스템에 놀랐을 것입니다. 패키지 구축 시스템은 사용자가 패키지를 빌드하기 위해 원격에서 리포지토리를 복제하도록 강요했습니다.

감사합니다. 링크의 주석에는이 수정으로 인해 스크립트 워크 플로에 예기치 않은 결과가 발생할 수있는 방법에 대한 설명이 있습니다. 문제는 git을 채우고 누락 된 객체 등을 연결하는 방법입니다. 올바르게 이해하면 디스크 사용량이 도움이되지 않습니다. 실제로 레시피 디렉토리에서 얕은 복제를 시도했지만 1GB makepkg이상이되었지만 (pkgver는 약간 불평하지만 여전히 작동합니다)!

2

와 동일한 디렉토리에 리포지토리의 얕은 미러를 만드는 경우 나머지 리포지토리가 업데이트 되지 않도록 하는 데 PKGBUILD사용할 수 있습니다 . 이는 수정할 필요가 제거 , 또는 자신을; 그러나 리포지토리 복제 / 업데이트는 수동으로 수행해야합니다.makepkg --holdvermakepkgPKGBUILDmakepkg.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.

makepkg은 아직 존재하지 않는 cling저장소를 복제 합니다. 즉, 위의 예제에서 저장소가 크지 않기 때문에 수동으로 복제를 생략 할 수 있습니다 .


1

makepkg 스크립트를 수정하지 않으려는 경우

설명 된대로 여기 , 지점 DEVELSRCDIR에서 /etc/yaourtrc또는 ~/.yaourtrc파일 일부 지속 폴더로 이동합니다. 그런 다음 모든 리포지토리 체크 아웃 (git / svn / ...)이이 폴더에서 발생합니다. 리포지토리가 복제되면 매번 전체 복제 대신 최신 버전의 빠른 가져 오기만 수행됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.