git clone が非常に遅い、または失敗する大規模プロジェクトに遭遇したことがあるかどうかはわかりません。みんなはどうやって対処するんだろう?
ダウンロード ソースを変更することを検討したり、インターネット速度を上げるために何らかの手段を使用したりすることもできますが、これらすべてを試しても、まだ比較的遅いと感じませんか?
今日、この問題に遭遇しました。gitlab から typescript コードをダウンロードする必要がありましたが、速度が非常に遅かったです:
git clone https://github.com/microsoft/TypeScript ts
長時間待っても、ダウンロードはまだ完了していませんでした。そこでパラメータを追加しました:
git clone https://github.com/microsoft/TypeScript --depth=1 ts
速度が数十倍に向上し、ダウンロードは一瞬で完了します。
-- Depth を追加すると、1 つのコミットのみがダウンロードされるため、コンテンツが大幅に減り、速度が向上します。 [関連する推奨事項: Git 使用法チュートリアル ]
ダウンロードされたコンテンツは、引き続き新しいコミットを送信し、新しいブランチを作成できます。その後の開発には影響しませんが、履歴コミットや履歴ブランチに切り替えることはできません。
私は自分のプロジェクトの 1 つでテストしました。最初にコミットをダウンロードしました:
次に、いくつかの変更を加え、次に git add、commit、push、Can を実行しました。通常どおり送信できます:
# 新しいブランチを作成すると、通常どおり送信できます。唯一の欠点は、履歴コミットや履歴ブランチに切り替えることができないことです。 これは、一部のシナリオでは非常に役立ちます。履歴ブランチに切り替える必要がある場合、必要なコミット数を計算し、深さを指定することもできるため、速度も向上します。 なぜこれが機能するのか考えたことがありますか? Git の原則Git はいくつかのオブジェクトを通じて情報を保存します:#コミットは相互に関連しており、ヘッド、ブランチ、タグなどは特定のコミットへのポインターです。 .git/refs で確認できます。このようにブランチやタグなどの概念はコミットをベースに実装されます。
Git は、これら 3 つのオブジェクトを通じてバージョン管理とブランチ切り替え機能を実装しています。すべてのオブジェクトは .git/objects の下に表示されます。
これが git の原則です。
主に blob、tree、commit の 3 つのオブジェクトと、head、tag、branch、remote などの ref を理解します。
単一のコミットをダウンロードできるという原則
#このようにして、そのコミットに基づいて新しいコミットが作成され、新しい BLOB、ツリーなどが関連付けられます。ただし、履歴のコミット、ツリー、および BLOB はダウンロードされていないため、スイッチバックすることはできません。また、対応するタグ、ブランチ、およびその他のポインターもダウンロードすることはできません。これは、単一のコミットをダウンロードする方法ですが、新しいブランチやコミットなどを作成することもできます。
概要
ダウンロードしたプロジェクトはその後の開発のために引き続き開発でき、新しいコミット、新しいブランチ、タグを作成できますが、過去のコミット、ブランチ、タグに切り替えることはできません。
Git の原則を整理しました。ファイルと送信情報はツリー、BLOB、コミットの 3 つのオブジェクトを通じて保存され、ブランチやタグなどの機能はコミット間の関連付けを通じて実装されます。コミットはエントリ ポイントであり、すべてのツリーと BLOB に関連付けられます。
コミットをダウンロードすると、それに関連付けられたすべてのツリー、BLOB、およびいくつかの参照 (タグ、ブランチなどを含む) がダウンロードされます。これが -- Depth の原則です。
このテクニックを使用して、過去のコミットやブランチに切り替えることなく、大規模プロジェクトの git clone 速度を向上できることを願っています。
以上がこのテクニックを使用すると、git clone を数十倍高速化できます。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。