Gitプロジェクトの一部だけを複製できますか?

Gitプロジェクトの一部だけを複製できますか?

GitHubで必要なslackbuildsコレクションを見つけました。 https://github.com/PhantomX/slackbuilds/ 私はすべての子供を取得したくありません。

git clone https://github.com/PhantomX/slackbuilds.git

しかし、slackbuildだけを得ることができます。これ

どうすればいいですか?可能ですか?

答え1

完全な履歴をダウンロードするので、大きな利点はありませんが、「レア」チェックアウトを使用して特定の部分をチェックアウトできます。引用するこのスタックオーバーフロー投稿:

疎化段階クローン以下に示すように:

mkdir <repo>
cd <repo>
git init
git remote add -f origin <url>

ここでやめましょう。他の文を引用したので引用された部分を編集したくないが、するいいえ-fと一緒に使用されますgit remote add。完全な履歴をインポートするインポートを実行します。以下を取得せずにリモコンを追加します。

git remote add origin <url>

その後、後述のように浅い取得を行います。

これにより、リモコンで空のストレージが作成され、すべてのオブジェクトがインポートされますが、チェックアウトすることはできません。次に、次のようにします。

git config core.sparseCheckout true

これで、実際にチェックアウトするファイル/フォルダを定義する必要があります。これは.git/info/sparse-checkout次のようにリストされています。

echo "some/dir/" >> .git/info/sparse-checkout
echo "another/sub/tree" >> .git/info/sparse-checkout

[...]

一度見てみたいかもしれません拡張チュートリアルおそらく公式を読む必要があります。スパースチェックアウトのドキュメント

おそらく、以下を使用する方が良いでしょう。浅いクローン。一般的な方法の代わりに、以下をgit pull試してください。

git pull --depth=1 origin master

私は最近これを再テストする機会がありました。Ubuntu Mono Powerlineフォント。上記の手順では約11MBをダウンロードし、そのうちUbuntuフォント自体は約900KBでした。

% git pull --depth=1 origin master
remote: Enumerating objects: 310, done.
remote: Counting objects: 100% (310/310), done.
remote: Compressing objects: 100% (236/236), done.
remote: Total 310 (delta 75), reused 260 (delta 71), pack-reused 0
Receiving objects: 100% (310/310), 10.40 MiB | 3.25 MiB/s, done.
Resolving deltas: 100% (75/75), done.
From https://github.com/powerline/fonts
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> origin/master
% du -hxd1 .
11M     ./.git
824K    ./UbuntuMono
12M     .

通常、clone約20MBかかります。少しの節約がありますが、十分ではありません。

使用--filter+ Ciro Santilli 回答のお支払い方法サイズは小さくなりますが、前述のように各BLOBが1つずつダウンロードされるため、遅くなります。

% git fetch --depth=1 --filter=blob:none
remote: Enumerating objects: 52, done.
remote: Counting objects: 100% (52/52), done.
remote: Compressing objects: 100% (49/49), done.
remote: Total 52 (delta 1), reused 35 (delta 1), pack-reused 0
Receiving objects: 100% (52/52), 14.55 KiB | 1.32 MiB/s, done.
Resolving deltas: 100% (1/1), done.
From https://github.com/powerline/fonts
 * [new branch]      master     -> origin/master
 * [new branch]      terminus   -> origin/terminus
% git checkout origin/master -- UbuntuMono
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 1.98 KiB | 1.98 MiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 581 bytes | 581.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 121.43 KiB | 609.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 100.66 KiB | 512.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 107.62 KiB | 583.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 112.15 KiB | 791.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 454 bytes | 454.00 KiB/s, done.
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), 468 bytes | 468.00 KiB/s, done.
% du -hxd1 .
692K    ./.git
824K    ./UbuntuMono
1.5M    .

重要な要約:--filterダウンロード全体の数を減らすには、フル、レアチェックアウト、および浅いレプリケーションを使用してください。または、ダウンロードの総数に気を付けずに1つのディレクトリしか必要としない場合(どのようにして得られたら)、スパースチェックアウト+浅いレプリケーションを使用してください。

答え2

git clone --filter+git sparse-checkout必要なファイルのみダウンロード

small/たとえば、このテストストアのサブディレクトリにあるファイルのみを複製するには、次の手順を実行します。https://github.com/cirosantilli/test-git-partial-clone-big-small-no-bigtree

git clone -n --depth=1 --filter=tree:0 \
  https://github.com/cirosantilli/test-git-partial-clone-big-small-no-bigtree
cd test-git-partial-clone-big-small-no-bigtree
git sparse-checkout set --no-cone small
git checkout

ダウンロードするディレクトリを複数選択することもできます。

git sparse-checkout set --no-cone small small2

ただし、この方法は単一のファイルでは機能しませんが、他の方法は次のとおりです。https://stackoverflow.com/questions/2466735/how-to-sparsely-checkout-only-one-single-file-from-a-git-repository/52270527#52270527

このテストでは、複製が本質的に即座に行われ、予想どおりに複製されたストレージが非常に小さいことがわかりました。

du --apparent-size -hs * .* | sort -hs

与える:

2.0K    small
226K    .git

テストリポジトリには以下が含まれます。

  • big/10MBのファイルを10個含むサブディレクトリ
  • 10x 10MBファイル0、、、1...9トップレベル(以前の試みからトップレベルファイルをダウンロードしたため)
  • asmall/small2/サブディレクトリには1000個のファイルが含まれており、各ファイルサイズは1バイトです。

すべてが擬似ランダムなので圧縮できないため、大容量ファイルがダウンロードされたかどうかを簡単に確認できます。そしてncdu

したがって、不要なものをダウンロードすると、100MBの追加スペースが得られます。これは非常に目立つでしょう。

上記では、git clone単一のオブジェクト、おそらくコミットをダウンロードします。

Cloning into 'test-git-partial-clone-big-small'...
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0
Receiving objects: 100% (1/1), done.

その後、最終チェックアウトは要求されたファイルをダウンロードします。

remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), 10.19 KiB | 2.04 MiB/s, done.
remote: Enumerating objects: 253, done.
remote: Counting objects: 100% (253/253), done.
Receiving objects: 100% (253/253), 2.50 KiB | 2.50 MiB/s, done.
remote: Total 253 (delta 0), reused 253 (delta 0), pack-reused 0
Your branch is up to date with 'origin/master'.

2023年1月、git 2.37.2、Ubuntu 22.10でテストされました。

TODOはまた、不要なツリーオブジェクトがダウンロードされるのを防ぎます。

上記のすべての方法をダウンロードしてください。Gitツリーオブジェクト(つまり、ディレクトリのリストですが、実際のファイルの内容ではありません。)以下を実行してこれを確認できます。

git ls-files

次の大容量ファイルのディレクトリが含まれていることを確認してください。

big/0

ほとんどのプロジェクトではこれは問題ではありませんが、私の中の完璧主義者はこれを避けたいと思います。

また、次のディレクトリの下に非常に大きなツリーオブジェクト(100 MB)を含む非常に極端なストレージを作成しましたbig_treehttps://github.com/cirosantilli/test-git-partial-clone-big-small

small/誰かがディレクトリを複製する方法を見つけたら教えてください!

コマンド情報

この--filterオプションはリモートプロトコルの更新とともに追加され、サーバーからオブジェクトがダウンロードされるのを防ぎます。

残念ながら、このsparse-checkout部分も必ず必要な部分です。また、わかりやすい特定のファイルのみをダウンロードできます。

git clone --depth 1  --filter=blob:none  --no-checkout \
  https://github.com/cirosantilli/test-git-partial-clone-big-small
cd test-git-partial-clone-big-small
git checkout master -- d1

しかし、この方法は何らかの理由でファイルを1つずつダウンロードするのは非常に遅いです。、ディレクトリにファイルがほとんどない場合は使用できません。

それほど詳細ではありませんが、失敗した別の試みは次のとおりです。

git clone --depth 1 --filter=blob:none --sparse \
  https://github.com/cirosantilli/test-git-partial-clone-big-small
cd test-git-partial-clone-big-small
git sparse-checkout set small

ただし、これにより、最上位ディレクトリのすべてのファイルがダウンロードされます。https://stackoverflow.com/questions/75311408/how-to-prevent-git-clone-filter-blobnone-sparse-from-downloading-files-on-t

夢:すべてのディレクトリにWebインターフェイスメタデータがある可能性があります。

この機能はGitに革命を引き起こす可能性があります。

企業のコードベースをすべて所有していると想像してください。単一の単一リポジトリからいいえ次のような醜いサードパーティ製ツールrepo

想像する見苦しいサードパーティの拡張機能なしで巨大なBLOBをリポジトリに直接保存します。

GitHubが許可されているか想像してくださいファイル/ディレクトリ別のメタデータアスタリスクや権限と同様に、すべての個人コンテンツを1つのリポジトリに保存できます。

想像してみてくださいサブモジュールは通常のディレクトリと同じように扱われます。:ツリーSHAとDNSに似たメカニズムでリクエストを解決します。、まずあなたの地元の~/.gitまず、より近いサーバー(企業のミラー/キャッシュ)に移動し、最終的にはGitHubに移動します。

私には夢があります。

テストコーンモノレポコンセプト

これは、サブモジュールなしで単一のストレージを維持するための考え方です。

サブモジュールとサブモジュール以外のコンポーネントで変更を加えるたびに、2つの別々のリポジトリにコミットする必要があるのは面倒なので、サブモジュールの使用を避けたいと思います。

Makefile または同様のものがあるすべてのディレクトリは、独自に構築およびテストする必要があります。

これらのディレクトリは次のように変更できます。

  • その下のすべてのファイルとサブディレクトリは、最新バージョンに直接保持されます。
  • 外部ディレクトリは、指定されたバージョンにのみ依存できます。

gitがデフォルトでこの機能をサポートし始めるまで(つまり、サブディレクトリのサブモジュールのみを追跡できます)、git追跡ファイルの一部のメタデータを使用してこの機能をサポートできます。

モノレポ.json

{
    "path": "some/useful/lib",
    "sha": 12341234123412341234,
}

ここでは、shaストレージ全体の共通 SHA を表します。その後、gitignoredフォルダなどのディレクトリを確認するスクリプトが必要ですmonorepo

monorepo/som/useful/lib

ファイルを変更するたびに、ツリーのMakefileを含むすべてのディレクトリをテストする必要があります。これは、ディレクトリがサブディレクトリの最新バージョンによって異なる可能性があるため、常に上記の内容が破損する可能性があるためです。

関連:

答え3

この試み:

svn export https://github.com/PhantomX/slackbuilds/trunk/${directory}

答え4

上記と同じ理由で結局成功しました。ファイルを直接編集しましたが、誤って引用符を含めてエラーが発生しました。 .git/info/sparse-checkout ファイルには引用符なしでディレクトリのみを含める必要があります。たとえば、次のようになります。この巨大なプロジェクトは次のとおりです。https://github.com/SharePoint/sp-dev-fx-webparts、私はサンプルディレクトリの反応スクリプトエディタだけが欲しい。 https://github.com/SharePoint/sp-dev-fx-webparts/tree/master/samples/react-script-editor

上記の指示に従い、.git/info/sparse-checkoutファイルにこの内容が含まれていると機能し始めました。

サンプル/反応スクリプトエディタ

関連情報