.gitフォルダーを縮小する方法


134

私の現在のベースの合計サイズは約です。200MB。

しかし、私の.gitフォルダーのサイズは5GB(!)と驚くべきものです。作業を外部サーバーにプッシュするので、ローカルの大きな履歴は必要ありません...

ノートブックの空き容量を増やすために.gitフォルダを縮小するにはどうすればよいですか?30日より古いすべての変更を削除できますか?

助けてくれてありがとう:)


2
の出力を投稿できますgit count-objects -vか?
CBベイリー

回答:


113

30日以上経過したすべての変更を削除しないでください(gitを悪用する可能性はあると思いますが、実際にはお勧めしません)。

を呼び出すとgit gc --aggressive --prune、リポジトリでガベージコレクションが実行され、古いオブジェクトが削除されます。頻繁に変更される多くのバイナリファイル(アーカイブ、画像、実行可能ファイル)がありますか?これらは通常、巨大な.gitフォルダーにつながります(gitは各リビジョンのスナップショットを保存し、バイナリファイルは不適切に圧縮されます)


32
実際にgit gc --aggressiveは、悪い習慣と見なされます。使用することをお勧めしますgit repack -a -d --depth=250 --window=250
Artefact2 2011

18
@knittl:絶対に。ここではLinus自身のメッセージは次のとおりです。gcc.gnu.org/ml/gcc/2007-12/msg00165.html
Artefact2

3
@ artefact2:リンクをありがとう!私はそれを読み、linusが指摘しているように、-aggressiveは(良い)デルタを再利用しません。これは、リポジトリが巨大であるため、この質問には存在しないようです。再梱包の方法を実行すると、実際にはかなり時間がかかります。git gc --aggressive250のウィンドウサイズ(マンページを参照)および250の深さ(ソースコードを参照)でrepackを呼び出します。--aggressiveは-fスイッチを追加して、以前のすべてのデルタ操作を破棄してやり直します(リンクにも記載されています)
knittl

1
私はgit-remote-hgを使用してhg.nginx.org/nginxリポジトリ(RELEASE-1.4.0がヒント)をチェックアウトしたところ、約100MBのリポジトリが生成されました。これを使用git gc --aggressive --pruneすると、19MBに減少しました。
Lekensteyn 2013

15
@ Artefact2あなたの声明は古くなっています:その投稿が何歳であるかに注意してください。実際、投稿されたのと同じ日に、メーリングリストでの議論の結果、次のコミットが行われました。[..]したがって、パッキングパラメータはどちらの方法でも同じです。。(commit 25ee973、2008年3月)--prune以来デフォルトになっているため、これも必要ありません。v1.5.5-rc0
Lekensteyn 2013

68

git Linusの作成者がgitリポジトリを縮小する方法について次のように語っています。

「git gc --aggressive」に相当-ただし、*適切に*-は、次のようなことを(一晩)実行することです。

   git repack -a -d --depth=250 --window=250

ここでの深さは、デルタチェーンの深さ(古い履歴の場合は長くする-スペースのオーバーヘッドに値します)であり、ウィンドウは、各デルタ候補にスキャンさせるオブジェクトウィンドウの大きさです。

ここで、「-f」フラグを追加することをお勧めします(これは、「古いデルタをすべて削除する」です。これは、実際に適切な候補を見つけることを確認しようとしているためです。

ソース:http : //gcc.gnu.org/ml/gcc/2007-12/msg00165.html

これにより、私のリポジトリで孤立したバイナリデータが削除されますか?"git repack"は、リポジトリにチェックインして削除した画像やバイナリデータをgitで取り除きません。これらの種類のデータをリポジトリから完全に削除するには、履歴を書き直す必要があります。その一般的な例は、誤ってgitでパスワードをチェックインした場合です。戻っていくつかのファイルを削除することはできますが、その場合は、履歴を今までに書き直してから、強制的にプッシュしてから、新しいリポジトリを元に戻す必要があります。


私にとって、.gitフォルダーは約1.5Gです。私はこれを試しましたが、次のエラーが発生しました。 fatal: Out of memory, malloc failed (tried to allocate 39763130 bytes)
Miron、

2
repackローカルで実行した後、コミットとプッシュを実行すると、縮小もリモートになりますか?
Timo

@David Dehghan:プロジェクトディレクトリから試してみましたが、.gitフォルダのサイズは変わりませんでした。これは予想されたものですか、それとも変更を確認するためにプッシュする必要がありますか?(申し訳ありませんがgitの経験はあまりありません。)私はリポジトリにimage / gifがあり、そのイメージの異なるバージョンを数回コミットしましたが、.gitサイズが大きくなったと思います。
giorgim

こんにちは、残念ながら、これが古いバイナリバージョンをクリーンアップする方法です。そのためには、実際には複雑な履歴を書き直す必要があります。ここではあなたのためにいくつかのリードがある:docs.microsoft.com/en-us/azure/devops/articles/...
デヴィッドDehghan

22

私はこれらを試しましたが、私のリポジトリはまだ非常に大きかったです。問題は、生成された大きなファイルを誤ってチェックインしてしまったことです。いくつか検索したところ、生成された大きなファイルを簡単に削除できる優れたチュートリアルが見つかりました。このチュートリアルでは、リポジトリを60 MBから1 MB未満に縮小できました。

Steve Lorek、Gitリポジトリを縮小する方法


4
リンクが腐敗した場合のアーカイブバージョンを以下に示します。この答えは、/私は.exeファイルと.zipファイルは.gitフォルダのサイズを肥大化されコミットされたところに出くわしたレポのために役立ちましたさ
doubleDown

9

5GB対200MBはちょっと変です。実行してみてくださいgit gc

ただし、リポジトリをモジュールに分割しない限り、.gitディレクトリのサイズを小さくすることはできません。

git repoの各クローンは、サーバーとして機能できる本格的なリポジトリです。これが、分散バージョン管理の基本原則です。


3

バージョン履歴よりも同期メカニズムとしてgitを使用しています。したがって、この問題に対する私の解決策は、現在のすべてのソースが適切な状態であることを確認し、.gitを削除してリポジトリを再初期化することです。ディスク容量の問題が解決しました。:-)履歴が消えました:-(これは、リポジトリが小さなUSBキー上にあるためです。履歴全体を使いたくない、または必要としません。履歴を切り捨てるだけの方法があれば、それを使用します。

私の履歴を保存することに興味がある場合は、現在のリポジトリをアーカイブします。後で、元のリポジトリのクローンを作成し、新しいリポジトリからすべての変更をコピーすることができます(名前の変更や削除をほとんど行っていないとしましょう)。次に、新しいリポジトリで行われたすべての変更を表す1つの大きなコミットを、古いリポジトリでの単一のコミットとして作成します。履歴をマージすることは可能ですか?多分私がブランチを使用して、それから不要なオブジェクトを削除した場合。(私はgitの内部について十分に知らないので、そのように浮気を始めます)。


1
代わりに、この使用例ではDropboxを使用できます。私は何年もしました。
ジョニー

0

上記の方法を試したところ、私の場合(git push中に誤ってgitプロセスを強制終了した場合)は何も機能しなかったため、最終的にリポジトリを削除して再度複製する必要があり、.gitフォルダーは通常のサイズになりました。


ディスクがいっぱいだった(.gitフォルダーが90 GBを超えている)ため、同じソリューションを使用する必要があり、repackやgit gcも実行できませんでした。
Fl4v
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.