web-dev-qa-db-ja.com

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

先日、インストールしてみました opencv-git from[〜#〜] aur [〜#〜]with makepkg with Arch Linux。もちろん、名前が示すように、gitリポジトリからプルします。これは1Gbを引き出します。 shallow clonegit で作成する方法について読んでいます。 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 は、私が探している洞察を提供しません。 makepkgpacmanmanpages もすばやく確認しました-方法を見つけることができないようです。

19
user44370

これは、カスタム dlagent を使用して実行できます。 Archのパッケージングやdlagentsのしくみがよくわからないので、ハックの答えしか得られませんが、それでうまくいきます。

アイデアは、カスタムダウンロードエージェントを使用するようにPKGBUILDを変更することです。ソースを変更しました

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

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

次に、浅いクローンを作成するmygitという新しいdlagentを定義しました。これを行うには、/etc/makepkg.confDLAGENTS配列に次の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が何をしているかを理解し、一時的にそれを修正することだと思います。これにより、ソリューションのすべてのハックの側面が回避されます。

13
StrongBad

個人的に私は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
11
amized

https://bugs.archlinux.org/task/23065 (jasonwryanへのクレジット)によると、AUR PKGBUILDに浅い複製機能を追加することは、2011年3月5日土曜日に、コメント:

終了の理由:実装しない

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

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

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

PKGBUILDと同じディレクトリにリポジトリの浅いミラーを作成する場合、makepkg --holdverを使用して、makepkgが残りのリポジトリを更新しないようにすることができます。これにより、PKGBUILDmakepkg.conf、またはmakepkg自体を変更する必要がなくなります。ただし、リポジトリの複製/更新は手動で行う必要があります。

cling-gitの例として、通常はllvmclang全体を複製します。

$ 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リポジトリはそれほど大きくないため、手動で複製することを省略できた可能性があります。

2
verstatx

Makepkgスクリプトを変更したくない場合。

概説 ここ 、_ [のポイントDEVELSRCDIR/etc/yaourtrcまたは~/.yaourtrcファイルを永続フォルダーに保存します。次に、すべてのリポジトリチェックアウト(git/svn/...)がこのフォルダで発生します。リポジトリのクローンが作成されると、毎回完全なクローンが作成されるのではなく、最新リビジョンのクイックフェッチのみが実行されます。

1
mzzzzb

回答済みの質問に回答して申し訳ありませんが、コメントを追加するのに十分なポイントがありません。

@StrongBadに触発されて、私はmakepkgの新しいプロトコルを追加しました。

'sgit::/usr/bin/emacs --batch --eval (Shell-command\ (concat\ \"git\ clone\ --depth=1\ \"\ (replace-regexp-in-string\ \"#\"\ \"\ --\"\ (substring\ \"%u\ \"\ 1))\ \"%o\"))'

Emacsの他に、他のインタープリターをここで使用できます。次に、空のスペースをエスケープして単一の引数と見なす必要があり、これがBashがアーカイブに失敗するポイントです。

0
linux40