関連する質問:なぜ Git はオリジン マスターをプッシュするたびにリポジトリ全体を送信するのですか?
短いバージョン: 2 つの Git リポジトリで作業している場合、コミット オブジェクトの 99% が同一であっても、がリポジトリAを指すように設定されているときにコミットをリポジトリBgit push
に送信するために使用すると、すべてのオブジェクト (200MB +) が転送されます。origin
より長いバージョン:継続的インテグレーション サーバーに 2 つ目の Git リポジトリをセットアップしました。コミット オブジェクトをローカルで準備した後、通常のように直接origin/master
プッシュするのではなく、この 2 番目のリポジトリのブランチに変更をプッシュします。CI サーバーは新しいブランチを取得し、それを に自動リベースしmaster
、統合テストを実行します。すべて問題なければ、ブランチをorigin/master
マスター リポジトリにプッシュします。
また、誰かが CI プロセスを迂回して直接プッシュした場合に備えて、CI サーバーはマスター リポジトリからgit fetch
の最新のコピーを取得するために定期的に呼び出します。origin/master
これは、特にgit fetch; git rebase origin/master
CI リポジトリにプッシュする前に a を実行した場合に、うまく機能します。Git は、まだ にないコミット オブジェクトのみを送信しますorigin/master
。プッシュする前にフェッチ/リベースのステップをスキップしても、プロセスは引き続き機能しますが、Git は、すべてではないにしても、大部分のコミット オブジェクトを CI リポジトリに送信しているように見えます。現在、200MB 以上の価値があります。(レポの新しいクローンは 225MB でクロックインします。)
私たちは何か間違ったことをしていますか?Git が CI リポジトリでブランチを形成するために必要なコミット オブジェクトのみを送信するように、この動作を修正する方法はありますか? 明らかに pre-push を実行することで問題を回避git fetch; git rebase origin/master
できますが、特にマスター リポジトリに直接プッシュしても同じ問題が発生しないため、その手順をスキップできるはずです。
私たちのリポジトリは Gitosis 0.2 によって提供されており、クライアントは圧倒的に msysgit 1.7.3.1-preview を実行しています。