web-dev-qa-db-ja.com

浅いクローンからGitフェッチを効率的に行う方法

gitを使用してオペレーティングシステムを配布し、最新の状態に保ちます 。リポジトリが大きすぎる(2GB以上)ため、完全なリポジトリを配布できません。そのため、浅いクローン(〜300M)を使用しています。ただし 最近、浅いクローンから取得する場合、2GBを超えるリポジトリ全体を非効率的に取得するようになりました 。これは、展開のための帯域幅の浪費です。

Gitのドキュメントには、浅いリポジトリから取得できないと書かれていますが、厳密にはそうではありません。 git clone --depth 1が変更されたものだけを取得できるようにする回避策はありますか?または、配布サイズを可能な限り小さく保つ一方で、gitがすべてのビットを更新する必要がある一方で、他の戦略はありますか?

--depth 20からクローンを作成しようとして失敗しましたが、それがより効率的にアップグレードされるかどうかを確認しましたが、うまくいきませんでした。 http://git-scm.com/docs/git-bundle も調べましたが、それは巨大なバンドルを作成するようです。

44
hendry

--depthgit fetchオプションです。私はドキュメントがgit cloneがフェッチを行うことを本当に強調していないのを見ます。

フェッチすると、2つのリポジトリは、リモートのヘッドから開始し、フェッチされたrefの履歴で最新の共有コミットを後方に検索し、不足しているオブジェクトをすべて埋めて、最新の共有コミットと新しくフェッチされたコミット。

--depth=1フェッチはブランチのヒントのみを取得し、過去の履歴は取得しません。これらの履歴をさらに取得すると、上記の手順によってすべてが新しく取得されますが、以前に取得したコミットが新しく取得した履歴にない場合、--depthで取得を制限しない限り、取得はすべてを取得します。

クライアントは1つのリポジトリからdepth = 1のフェッチを行い、URLを別のリポジトリに切り替えました。この新しいレポのrefの少なくとも1つの長い先祖パスは、現在レポにあるものとコミットを共有していないようです。それは調査する価値があるかもしれませんが、何らかの理由がない限り、クライアントはフェッチ--depth=1をすべて実行できます。

37
jthill

g clone github.com:torvalds/linuxを実行しただけで、非常に時間がかかったため、CTRL+Cでスキップしました。

その後、g clone github.com:torvalds/linux --depth 1を実行し、非常に高速にクローンを作成しました。 git logにはコミットが1つしかありません。

したがって、clone --depth 1は機能するはずです。既存のリポジトリを更新する必要がある場合は、git fetch Origin branchname:branchname --depth 1を使用する必要があります。これも機能し、1つのコミットのみをフェッチします。

要約:

初期クローン:

git clone git_url --depth 1

コード更新

git fetch Origin branch:branch --depth 1
26
Waterlink

Git 1.9/2.0(2014年第1四半期)は、浅いクローンをフェッチする際により効率的である可能性があることに注意してください。
commit 82fba2b 」を参照、 NguyễnTháiNgọcDuy(pclouds

Gitは浅いクローンとのデータ転送をサポートしているため、これらの制限はもはや当てはまりません。

すべての詳細は、「 shallow.c.git/shallow の新しいコミットを選択する8つのステップ」にあります。

0d7d285f2c681c 、および c29a7b8 などのコミットで結果を確認できますクローンをサポートします。浅いクローンを含む/からのsend-pack/receive-packです。
smart-httpは浅いフェッチ/クローンもサポートするようになりました
浅いレポをクローン することもできます

更新2015:git 2.5+(2015年第2四半期)では、単一コミットフェッチも許可されます! 「 リモートgitリポジトリから特定のコミットをプルする 」を参照してください。

更新2016(10月):git 2.11+(2016年第4四半期)でフェッチを許可:

11
VonC

特定のブランチを選択できる場合は、さらに高速になります。 Spark masterブランチと最新のタグを使用した例:

初期クローン

git clone [email protected]:Apache/spark.git --branch master --single-branch --depth 1

特定のタグへの更新

git fetch --depth 1 Origin tags/v1.6.0

この方法でタグ/ブランチを切り替えると、非常に高速になります。

9
Martin Tapp

セットアップに適しているかどうかはわかりませんが、使用するのは、別のディレクトリにリポジトリの完全なクローンを作成することです。次に、ローカルリポジトリを参照して、リモートリポジトリから浅いクローンを作成します。

git clone --depth 1 --reference /path/to/local/clone [email protected]/group/repo.git 

この方法では、参照リポジトリとリモートとの違いのみが実際に取得されます。さらに高速にするには、--sharedオプション、ただしgitのドキュメントの制限について必ずお読みください(危険な場合があります)。

また、状況によっては、リモートが大きく変更されたときに、クローンが大量のデータを取得し始めることがわかりました。それを壊し、参照リポジトリを更新することは良いことです(奇妙なことに、最初に必要だったよりもはるかに少ない帯域幅を使用します)。その後、クローンを再度開始します。

1
Rajish