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

일전에 내가 설치 시도 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 – 그 작업을 수행하는 방법을 찾을 수 없습니다.



답변

이것은 사용자 정의 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 가하는 일을 파악하고 일시적으로 재정의하는 것입니다. 이것은 솔루션의 모든 해킹 측면을 피해야합니다.


답변

개인적으로 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


답변

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

폐쇄 사유 : 구현하지 않음

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

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

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

답변

와 동일한 디렉토리에 리포지토리의 얕은 미러를 만드는 경우 나머지 리포지토리가 업데이트 되지 않도록 하는 데 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저장소를 복제 합니다. 즉, 위의 예제에서 저장소가 크지 않기 때문에 수동으로 복제를 생략 할 수 있습니다 .


답변

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

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


답변