gitソースを使用して浅いクローンのみをプルするPKGBUILDを変更するにはどうすればよいですか?


18

先日私がインストールしようとしたopencv-gitからAURmakepkgアーチ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は、私が探している洞察を提供しません。またmakepkgpacman マンページをすばやく確認しました-その方法を見つけることができないようです。


「最終的に、レシピの作成に失敗しました。」あなたは正確に何をしましたか、何が間違っていましたか?詳細を入力してください。かつて誰かがIRCで私に言ったように、残念ながら私たちは水晶玉を家に置いてきました。おそらくネットワークの問題が原因で、gitリポジトリが正常にクローンできなかったかのように、行間を読んでいるように聞こえますか?しかし、私は推測しています。明示してください。
ファヒムミタ14

経験に基づいた推測では、プロセスを2つの部分に分割できます。最初にgitリポジトリをシャロークローンなどとしてクローンします。次に、レシピを適用します。git+http://github.com/Itseez/opencv.gitAURレシピのネットワークアドレスをローカルパス名に置き換えることができると思います。試しましたか?このビルドシステムがローカルで利用可能であってもリポジトリのクローンを強制する場合、かなりおかしくなります。
ファヒームミサ14

@FaheemMithaありがとうございます、ビルドで失敗するという言及を削除しました-私は気にしません。あなたが説明したようなものに基づいた統合ソリューションを探しています。私は...ローカルコンテンツがある場合はダウンロードしないオプションがあるかもしれないと思う

この質問をする主な理由が不必要な帯域幅/スペースの使用を避けることである場合、そう明示的に言っても害はないでしょう。私が言ったように、ローカルパスのみを使用してみてください-これはおそらく最小の驚きの原理で動作します。浅いクローンを指定するオプションがマニュアルページに記載されていない場合、機能が利用できない可能性があります。適切なArchフォーラム(おそらくそのビルドシステム専用のメーリングリスト)に問い合わせることをお勧めします。最初に、その機能が存在するかどうかを明確にします。そうでない場合は、ウィッシュリストのバグを報告できます。
ファヒムミサ14

回答:


13

これは、カスタムdlagentを使用して実行できます。私はArchのパッケージングや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だけがダウンロードされるようになりました。
修正

鮮やかさ!トンありがとう!これがデフォルトです。
ccpizza

注:これは、たとえばタグに応じてPKGBUILDで失敗します。この議論を参照してください。しかし、それはおそらく(そこ断片を用いて固定することができbranchtagcommitなど)。
BenC

7
注:/usr/share/makepkg/source/git.sh代わりにパッチを適用する必要があります
-nponeccop

6

https://bugs.archlinux.org/task/23065(jasonwryanの功績)によると、AUR PKGBUILDに浅いクローン機能を追加することはウィッシュリスト項目であり、2011年3月5日土曜日にコメントで閉じられました:

閉鎖の理由:実装しない

これは、誰かがパッチを提出しない限り、起こらないことを示唆しています。

コメントでポスターに提案したように、彼がやろうとしていることは、プロセスを2つのステップに分割することでほぼ確実に達成できます。

  1. 浅いクローンを使用してgitリポジトリをクローンします
  2. PKGBUILDレシピを実行しますが、ローカルクローンをポイントします。私はArchユーザーではないので、これが事実かどうかはわかりませんが、パッケージをビルドするためにユーザーがリモートからリポジトリをクローンすることを強制するパッケージビルドシステムには非常に驚かされます。

ありがとうございました。リンクのコメントには、この変更がスクリプトワークフローに予期せぬ結果をもたらした可能性があるという議論があります。問題は、Gitがどのように欠落オブジェクトなどにデータを取り込みリンクするかです。ディスクの使用は、正しく理解していれば利点にはなりません。実際、レシピディレクトリで浅いクローンを作成しようとしましたが、最終的には1GB以上でしたが、それはmakepkg(pkgverは少し文句を言いますが)まだうまくいきました!

2

リポジトリと同じディレクトリにリポジトリの浅いミラーを作成する場合、リポジトリの残りの更新を防ぐためにPKGBUILD使用できます。これは修正する必要がなくなり、または自体; ただし、リポジトリのクローン作成/更新は手動で行う必要があります。makepkg --holdvermakepkgPKGBUILDmakepkg.confmakepkg

の例として、cling-git通常はllvmand の全体を複製します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ページから:

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