先日、インストールしてみました opencv-git
from[〜#〜] aur [〜#〜]with makepkg
with Arch Linux。もちろん、名前が示すように、gitリポジトリからプルします。これは1Gbを引き出します。 shallow clone を 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 もすばやく確認しました-方法を見つけることができないようです。
これは、カスタム dlagent を使用して実行できます。 Archのパッケージングやdlagentsのしくみがよくわからないので、ハックの答えしか得られませんが、それでうまくいきます。
アイデアは、カスタムダウンロードエージェントを使用するようにPKGBUILDを変更することです。ソースを変更しました
"${pkgname%-git}::git+http://github.com/Itseez/opencv.git"
に
"${pkgname%-git}::mygit://opencv.git"
次に、浅いクローンを作成するmygit
という新しいdlagentを定義しました。これを行うには、/etc/makepkg.conf
のDLAGENTS
配列に次の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が何をしているかを理解し、一時的にそれを修正することだと思います。これにより、ソリューションのすべてのハックの側面が回避されます。
個人的に私は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日土曜日に、コメント:
終了の理由:実装しない
これは、誰かがパッチを提出しない限りそれが起こらないことを示唆しています。
私が投稿者にコメントで提案したように、彼がやろうとしていることは、ほぼ確実にプロセスを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のmanページから:
--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/...)がこのフォルダで発生します。リポジトリのクローンが作成されると、毎回完全なクローンが作成されるのではなく、最新リビジョンのクイックフェッチのみが実行されます。
回答済みの質問に回答して申し訳ありませんが、コメントを追加するのに十分なポイントがありません。
@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がアーカイブに失敗するポイントです。