私はときどき高価なインターネット接続を使用していますが、git push
.
2 に答える
実際、私は自分のコメントが答えとして投稿するのに十分好きだと思います!
プッシュすると、gitは必要なすべてのオブジェクトのパックを作成し、それをリモートにアップロードします。これは、そのパックサイズを予測する方法を探していることを意味します。パックは圧縮されているため、差分やオブジェクトサイズに基づいて何かを行うことは非常に困難です。私たちが本当にやりたいのは、そのパックがどれだけ大きくなるかを確認することです。パックを構築した直後にプッシュを中断して、パックのサイズに基づいて続行することを決定できればいいのですが、それは不可能だと思います。私の最善の推測は、プッシュされるパックを再作成してそれを検査することです。
バンドルファイルは基本的にヘッダー情報を含むパックです(必要に応じてソースを参照してください)。これは、気になるサイズのファイルを作成する便利な磁器コマンドであることを意味します。( pack-objectsを手動で使用するよりもはるかに簡単です。)次のようなものを使用します。
git bundle create foo.bundle ^origin/master master
リモートにオリジン/マスターがある場合、マスターに到達するために必要なすべてを含むバンドルが提供されます。これは、によってプッシュされる必要があるものとまったく同じですgit push origin master
。プッシュするブランチが追加されている場合は、それらを追加することもできます。それは単にrev-list引数を取っているだけです:
git bundle create foo.bundle ^origin/master master ^origin/topic topic ...
作成したバンドルのサイズを確認するだけです。それはあなたがプッシュすることになるものとほぼ同等でなければなりません。これは、パックを2回(バンドルで1回、プッシュで1回)作成する必要があることを意味しますが、これがパックするのに長い時間がかかる本当に大きなプッシュでない限り、それはすべきではありません大きな問題。
プッシュするパック ファイルを作成するときに Git が内部で実行するものと同様の Bash を実行することで、ほぼ正確に調べることができます。
$ echo $(git merge-base HEAD origin/master)..HEAD | git pack-objects --revs --thin --stdout -q | wc -c
これにより、Git が送信するパック ファイルのバイト数が出力されます。内訳:
# Find the common ancestor of HEAD and origin/master, and output a
# revision range (<a>..<b>) string to git pack-objects.
echo $(git merge-base HEAD origin/master)..HEAD
# Generate the pack file containing the revision range specified above, writing
# it to stdout.
git pack-objects --revs --thin --stdout -q
# Print the byte count of the file contents passed via stdin.
wc -c
これは、git fetch
プッシュする前に右を実行することが条件です。そうしないと、Git は共通の祖先を見つけることができず、リポジトリ全体のコンテンツを送信します。詳細については、この回答を参照してください。