不安定な接続で大きなプロジェクトのGitクローンを完了するには?


193

LibreOfficeコードベースをgit cloneしようとしていますが、現在のところ、約300 kbpsのインターネット接続があり、安定性に欠けています。接続はいつでも元に戻すことができますが、git cloneプロセスはすでに動作を停止しており、再び実行する方法はありません。より失敗に強いgitクローンをダウンロードする方法はありますか?

私が自分で考えたオプションの1つは、他の人の.gitディレクトリをダウンロードすることですが、それは他の人に過度に依存しており、私にとって最善の解決策とは思えません。


6
すべてのリビジョンまたは最新のクローンを作成する必要がありますか?多分depth -1解決策ですか?
takeshin

1
バンドルアプローチは、のようなリポジトリに対してすでに用意されていkernel/git/torvalds/linux.gitます。そして再開可能なgitクローンが議論されています(2016年3月)。stackoverflow.com/a/29192890/6309を参照してください。
VonC 2016

私は疑問に思う。やっていないだろうgit init、リモートを設定し、それはトリックを行い成功するまでフェッチやって?接続が失敗した場合、フェッチは正常にダウンロードされたオブジェクトを破棄するとは思わない。
АндрейБеньковский

@АндрейБеньковский誰かがこれを試しましたか?
William Entriken 2017

回答:


71

これはまだ準備ができていないと思います。あります古いGSOCページご希望の機能を実装する計画しました。私の最善の策は、あなたがディレクトリとしてダウンロードすることを提案したようにです。他のプロトコルでダウンロードを再開できると思います。

再起動可能なクローン

大規模なリポジトリー(KDE、Open Office、Linuxカーネルなど)のクローンを作成する場合、中断されたクローンを再起動する方法は現在ありません。小さなパイプの端にいるユーザーがデータをダウンロードするにはかなりの時間がかかる場合があります。クローンが途中で中断された場合、ユーザーは最初からやり直す必要があります。一部のユーザーにとって、これは大きなリポジトリを複製することを不可能にするかもしれません。

目標:git-cloneが以前に失敗したダウンロードをネイティブのgit://プロトコル経由で自動的に再開できるようにします。言語:Cメンター:Shawn Pearce提案:gmaneのShawn Pearce


更新

git clone --depth=1他の回答の1つにある浅い複製()の提案に加えて、プロバイダーと通信できる場合に、誰かがあなたのために裸のリポジトリを作成できると役立ちます。ベアリポジトリを完全なリポジトリに簡単に変換できます。浅いクローンは必ずしも役立つとは限らないため、その回答のコメントも読んでください。


情報をありがとう、それで私の問題はわかっており、解決策は解決されています...回避策として何を勧めますか?
LaPingvino

9
さて、昨日、私はこの問題のために600ルピー($ 10)を失いました。インターネット帯域幅は私の世界の一部では非常に貴重なものです。
Amit Singh Tomar

2
多くの人がアップデートを求め、ソリューションへの貢献を誰も共有していません。
William Entriken 2017

2
3月18日-まだそのためのルーキン...この地球上で!!
地球人

3
11年後、Google FibreとGoogle Fiによる信頼できない帯域幅の根本的な社会経済的問題に対するGoogleの攻撃は、さまざまな結果をもたらしました。ルイビル市のファイバーマイクロトレンチが浅くアスファルトに切り込まれており、作業直後にケーブルが路面から飛び出していました。一方、--depth 1および--unshallow使用方法の耐え年を持っているように見えます。
rwong

126

頭に浮かぶ2つの解決策(またはむしろ回避策)は次のとおりです。

  • 浅いクローンを使用します。つまりgit clone --depth=1Nを増やしながらを使用してこのクローンを深くします。(1.8.0.3以降)を使用して、残りのすべてのリビジョンをダウンロードできます。git fetch --depth=Ngit fetch --unshallow

  • タグ付けされたリリースにバンドルするように誰かに依頼してください(git-bundle(1)マンページを参照)。バンドル自体は通常のファイルであり、再開サポート付きのHTTP / FTP経由、BitTorrent経由、rsync経由など、任意の方法でダウンロードできます。バンドルからクローンを作成し、構成を修正して、公式のLibreOfficeリポジトリからさらにフェッチできます。 。


3
浅いクローントリックは、実際にはうまく機能しません。十分にパックされたリポジトリ(git://libvirt.org/libvirt.git)を複製すると、68Mの転送が61M + 35Mの転送に変わります。深さ1のすべてのブランチではなく、ワークツリーに優先順位を付ける機能の方が適切かもしれません。セッションの再開はまだ良いでしょう。
東武

1
@Tobu:lonGの履歴があるリポジトリでは、浅いクローントリックが機能する可能性があります。浅いクローンがデフォルトで単一のブランチのみを取得するようにするための進行中の作業があります。それが役に立ったかもしれません。か否か。
JakubNarębski、2012年

6
これは現在、git 1.7.10で非常にうまく機能しています。Gitリポジトリの最初のdepth = 1クローンはわずか4.72Mbですが、リポジトリ全体は55Mbです。それ以上のフェッチは、必要なだけ小さくすることができます(深さ= 100は、私に〜20Mbのフェッチを与えました)。圧縮されたダウンロードの合計は31Mbで、1つのクローンと3つのフェッチを超えました。
naught101

2
@ naught101 1つのリビジョンのオブジェクトをダウンロードし、ソースコード自体が大きい(履歴ではない)場合、再び問題になります...
kan

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];done私のために働いた、ありがとう!:)
Trass3r

15

この方法では、サードパーティのサーバーを使用します。

まず、を実行し git clone --bare、次に rsync -v -P -e ssh user@host:repo.git . Windowsでmsysを使用できます。


--bareオプションを試したところ、repo.git内に.git内部ファイルの予想されるコンテンツが作成されました。実際のリポジトリを取得するには、git clone file:///path/to/repo.git/を実行する必要がありました
PiyusG

1
Linus はGitHubを所有していません。「サードパーティサーバー」によるものですが、実際には「ユーザーを刑務所にrsync(1) 送り込んでGitHubがユーザーの使用を禁止しているほどGitHubを禁止していないGitサーバー」という意味ですか?または、最初git clone サードパーティのサーバーを起動してから、それをローカルマシンにrsyncするということですか?
JamesTheAwesomeDude 2018

12

キャリアピジョンとSDカードのバンドルの帯域幅を過小評価しないでください」が、この回答の現代的な形になります。それをタールで覆いcp -a、何でも平易に古くして、いまいましいものを郵送してください。サムドライブをSASEに入れるのに2分かかることをいとわない人を見つけましょう。連絡先を見つけてください、彼らはあなたのためにそれをするかもしれません。


9

「他の誰かの.gitディレクトリをダウンロード」することはできますが、その誰かが公式リポジトリそのものになります。LibreOfficeリポジトリはhttp経由で利用できます。たとえば、http://anongit.freedesktop.org/git/libreoffice/build.git/にあります(完全なリストについてbuild.gitは、http://cgit.freedesktop.org/libreoffice/を参照してください)。 http URLは、各リポジトリのページの下部にあります)。

これらのhttp URLに表示されるのは.gitディレクトリ(実際には「ベア」リポジトリ.git)であり、ディレクトリにあるものだけが表示されます。これは、git://プロトコル(git daemon)のサーバーが読み取るディレクトリと同じです。これらのディレクトリのコピーをWebダウンローダー(たとえばwget -m -np)で作成すると、コピーからクローンを作成でき、httpリポジトリから直接クローンを作成した場合と同様に機能します。

したがって、できることは、リポジトリごとに、お気に入りのWebダウンローダー(壊れたダウンロードの再開に関するすべての問題を処理します)でそのリポジトリのコピーを取得し、そのコピーから複製することです。更新する場合は、お気に入りのWebダウンローダーを使用してコピーを更新し、そのコピーからプルします。これで、クローンとアップデートは、お気に入りのWebダウンローダーと同じように接続不良に対して耐性があります。


彼らはただ1つのリポジトリーに変換しましたが、ヒントを試してwgetが一度にサイトをダウンロードすることにしました...(今すぐ再試行すると、おそらくここで後で更新されます...)
LaPingvino

あなたのコマンドはサイト上のすべてのリンクを取得するようですが、これは意図されていることではありません。私はここで動作するように見えるスクリプトを書くことに頼りました:gist.github.com/1307703 とにかく、最初のアイデアに感謝します!
LaPingvino、2011年

興味深いアイデアです。私はgithubからルビー/ルビーのリポジトリを取得しようとしていますが、robots.txtによってブロックされています...何か提案はありますか?
hanetzer

6

git cloneそれを構成要素に分解して、git checkoutファイルの再ダウンロードを防ぐために使用しましょう。

ときにgit clone実行する、それがない最初のいくつかは、同等です

git init
git remote add origin <repo_url>
git fetch origin <branch>

上記の手順を手動で実行し、それらが正しく完了したと仮定すると、必要に応じて次の手順を何度でも実行できます。

git checkout --force <branch>

実行するたびにすべてのファイルをチェックアウトしますが、ファイルを再ダウンロードする必要がないため、時間を大幅に節約できることに注意してください。


1
それはあなたが説明する方法では機能しません、フェッチが壊れた後にgitリセットを行うことを許可しません
MaikoID

先に述べたように、フェッチが正常に完了したと想定したら、git resetを実行できます。フェッチが失敗した場合、リセットは機能しません。A)動作するまで繰り返しフェッチを繰り返し試行するか、B)これを中止して別のことを試みる必要があります。
カウリネーター2017年

私はそれが奇跡的に働いた別のことをしました。私はgit fetchの代わりにgit pullを実行しました=)
MaikoID '11 / 11/17

@MaikoID git pullは内部でgit fetchを呼び出してマージするだけなので、コマンドによって違いが生じるはずです
lucidbrot

4

サードパーティのサーバーにアクセスできる場合は、そこにクローンを作成してからコピーできます。


4
git clone --depth <Number> <repository> --branch <branch name> --single-branch

このコマンドは私を助けます(Nicola Paolucciに感謝)

例えば

git clone --depth 1 https://github.com/gokhanmoral/siyahkernel3 --branch ics  --single-branch

4

クローン/深度ベースの回答に基づいて構築-bashの数行でこれを簡単に行うことができます...

git clone --depth=1 something@somegit.com:/var/git/whatever.git <directory> cd <directory> for m in `seq 1 100`;do git fetch --depth=$m;done


おかげで、それはうまくいくようです、私はArduinoをクローンしようとしています、それは約800MBで25%でした、そしてそれはクラッシュしました。部分的にダウンロードする方が安全と思われますが、1刻みでダウンロードする必要はないかもしれません。更新方法に応じて、10または50の方が良いでしょう。8万のファイルを想像してください。使用:for m in seq 1 10 1000; do git pull --depth = $ m; done to get steps of10。PSCtrl + CIを実行すると、現在のパッケージのみが失われ、最初からやり直すことができます
user3394963

3

この問題も私を噛みました。私の場合、回避策があります。それはあなたのケースに当てはまる場合と当てはまらない場合があります。

リモートシステムでgit操作を開始するために携帯電話を使用することがあります。もちろん、私のWi-Fiが壊れた場合、セッションは終了し、Gitは回復せずにクローン操作全体をドロップします。しかし、私のリモートシステムからgit masterへのインターネット接続はしっかりしているので、クローンを停止する必要はありません。私が必要なのは、クローンをターミナルセッションから切り離すという常識です。これは、screen / tmuxまたはnohup / daemonを使用して行うことができます。だから、私の場合、それはライブウェアの誤動作です。



2

CNTRL Zを使用して複製を停止します。端末を閉じないでください。システム/ラップトップを休止状態にして、後でfgコマンドを実行してください。repo frm githubのクローンを作成しようとしているときに、今日も同じ問題に直面していました。これは私にとって時間の節約になった。


2

バッファサイズを大きくすると、この問題に役立ちます。手順に従ってください。

手順:

1 .OpenターミナルまたはGit Bashで、「cd」を使用して、リポジトリのクローンを作成する場所に移動します。

2.圧縮を0に設定します

git config --global core.compression 0

3. postBufferサイズの設定

git config --global http.postBuffer 1048576000

4. maxRequestBufferサイズを設定する

git config --global http.maxRequestBuffer 100M

5.今すぐクローンを開始

git clone <repo url>

6.クローンが完了するまで待ちます。

ありがとうございました。ハッピーコーディング!!!


これは間違いなく受け入れられる答えになるはずです。問題を解決します。
SuperEye

1

ここに5セント入れたいのですが。これが実際にこの問題を解決するのに役立ちました

  • 圧縮をオフにする
  • http.postBufferを増やす
  • 部分的なクローンを行う
  • クローンされたディレクトリに移動し、残りのクローンを取得します
  • 残りを引っ張る
git config --global core.compression 0
git config --global https.postBuffer 524288000
git clone  <your_git_http_url_here> --depth 1
git fetch --unshallow 
git pull --all

これにより、8 Mbpsのadsl接続で最大3 GBのレポを複製できました。もちろん、フェッチとプルを数回実行する必要がありましたが、それでも...


0

サーバーの帯域幅が広い(そしてサーバーがある)と仮定した場合、別の答えは次のとおりです。

  1. サーバーサイドGitラッパーを使用して独自のサーバーを作成するさんを
  2. サーバーに複製します
  3. それはサーバー側の使用ジップジップアーカイバさんを
  4. サーバーサイドのレジュームサポートからダウンロードします。

しかし、これは非常に基本的なWeb開発経験でのみ機能します;)またgit.exe、サーバーで必要です


0

ここで同じ問題-私はしばしば10-15 kb /秒以下の本当に不安定なインターネット接続を持っています:-P

私にとって、wgetの方法は非常にうまくいきました。緑色のボタン「クローンまたはダウンロード」があるリポジトリサイトに移動し、クリックして、ZIPダウンロードオプションのリンクをコピーします。

次に、wgetコマンドへのリンクを挿入します
。wget -c -m -np https://github.com/your/repository/archive/master.zip

魅力のように動作します...


0

私のために働いた最良の回避策:

悪いインターネット接続で同じ問題に直面しました。だから私は次の解決策を思いついた:

サーバーに小さなphpファイルを作成して、パッケージをzipファイルとしてダウンロードします。

<?php
$url = "https://codeload.github.com/CocoaPods/Specs/zip/master";
file_put_contents("coco.zip", fopen($url, 'r'));
?>  

<a href="coco.zip">coco.zip</a>

次に、再開をサポートするダウンロードマネージャーを使用してzipファイルをダウンロードします


-1

水銀をhg-git拡張で使用してみることができます。

それがうまくいかない場合git fetch <commit-id>は、リモートgitリポジトリの一部のみをフェッチするために使用できます(空のgitリポジトリにフェッチできます。クローンで作成する必要はありません)。ただし、このアプローチを使用する場合は、ブランチ構成を修正する(=ローカルおよびリモート追跡ブランチを作成する)必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.