この質問は本質的にはthisと似ていると私は前に言います。これを一意にする重要な違いが1つあります:生のgitプロトコル(基本的なパックネットワークプロトコルに精通していない場合はhereとhereを参照してください)を使用したいと思います。Gitはリモートリポジトリから単一のファイルをプログラムで取り出します
私は、匿名のgitリポジトリに接続するScalaとJGitを使用してアプリケーションを作成しています。私は単一のブロブを要求したい( "/path/to/file.txt" @ "refs/heads/branch1"と考える)。最終的に私の目標は、リモートリポジトリから単一のファイルをプログラムで取得することです。できることはかなり有用なもののようです。
私はこのプロトコルの内部について掘り下げて検討してきました。これの基本的なバージョンは "私はこれらのオブジェクトが必要です、私はこれらのオブジェクトを持っています"と思われます - そしてバム、あなたが持っていないすべてのパックファイルがあります。私の質問の中核は:の非再帰的なの方法で単一オブジェクトのgit-upload-packfileをどうやって尋ねるのですか?私は、単一のコミットオブジェクトをダウンロードしてから、木、次にサブツリー、次に別のサブツリー、そして最後にブロブそのものを求めてもOKです。スピードはあまり重要ではない、主に私は帯域幅を節約しようとしています。しかし、単にgit-upload-packfileに "私に求めているオブジェクトを与えてください"と言うことはできないようです。
はい、リポジトリのコンテンツに関する先験的な知識が必要です(ローカルリポジトリを持っていない、覚えています)。私はすべての可能なsha1のリストを生成し、私が望むものを除いてそれらのすべてを送ることができますが、それはばかげています(時間がかかり、帯域幅が消費され、あらゆる場所のプログラマーに対して犯罪になる)
もう一つの可能な解決策リモート側でgit-upload-archiveを使っているのですが、私はまだそれに目を向けていませんでした。
私はJGitを書き直したいと思っていますので、「どうすればJGitを行うのですか...」と読んでください。私は、プロトコルそのものがこれでも可能かどうかを知りたがっています。私が望むものを達成するためにプロトコルを乱用する素晴らしい方法があるように思えます。何かご意見は?
"これはうまくいきません"との回答があると思います... " – twalberg
@twalbergローカルレポは確かです。私がワイヤーでこれをすることができるかどうか不思議です。 –
はい、ローカルリポジトリから1つのオブジェクトを抽出できます。ワイヤプロトコルはそれを行うようには設計されていませんでした。クローン/フェッチ(完全なリポジトリを避けるために浅いクローンを使用していても、まだコミット+ツリー+ブロブを取得する)をローカルリポジトリに適用してオブジェクトを抽出することで、最終目標を達成することができます。あなたが有線経由でそれをすることができるとは思わない(ただし、あなたがリモートへのsshアクセスを持っていれば、それを偽装することができるかもしれない)。 – twalberg