gitフォルダーのサイズを小さくする方法はありますか?


156

私のプロジェクトはすべてのgitでどんどん大きくなっているようcommit/pushです。gitフォルダーをクリーンアップする方法はありますか?

回答:


214

あなたが何を望んでいるかはわかりません。まず第一に、もちろん、ディレクトリをコミット/プッシュするたびに、追加のコミットをそれぞれ格納する必要があるため、ディレクトリは少し大きくなります。

ただし、おそらくgit gc「不要なファイルをクリーンアップしてローカルリポジトリを最適化する」(マニュアルページ)が望ましいでしょう。

おそらく関連する別のコマンドはgit clean、追跡されていないファイルをツリーから削除することです(マニュアルページ)。


30
git clean -d -f -xは、.gitignoreなどにリストされているファイルを削除します。例:git、Podsフォルダーなどに属さないワークスペース
Kalle

102
WARNING@Kalleで上に書いたように、コマンドが削除されますEVERY >人跡未踏<ファイルとディレクトリのを YOUR GIT ROOT、WITHINないだけ「.gitignoreにリストされたファイル」。にリストされているかどうかに関係なく、Gitによって追跡されていないものは.gitignoreすべて消去されます。git clean -dfX(のケースに注意X)は、に適用可能なルールがあるアイテムのみを削除します.gitignoreこの警告に注意してください:の 代わりにインタラクティブモードで実行することなく、または少なくとも最初にドライランを実行してから、次にを使用して実行しgit cleanないでください。-i-f-n-f
エイドリアン・ギュンター

5
またはバックアップを作成:-)
Mateen Ulhaq 2017年

61

実行:

git remote prune origin

ですでに削除されoriginているが、でローカルに使用可能な古い追跡ブランチをすべて削除しremotes/originます。

git gc --auto

Gの arbageのCの ollection」 -ハウスキーピング・タスク(圧縮リビジョン除去するが緩ん/アクセスできないオブジェクト)を実行します。--autoフラグは、最初にすべての作業が必要かどうかを判断し、ない場合は何もせずに終了します。


4
それらが何をするかのいくつかの説明?GoogleでそれらをGoogleで検索してドキュメントを検索できることは知っていますが、コードやコマンドのみが含まれる場合は、回答の簡単な説明を提供するのが一般的です。
Dzhuneyt 2014年

28

あなたのGitのレポが得る一つのシナリオ真剣それぞれに大きなコミットはあなたが定期的に発生するというバイナリファイルをコミットしているものです。それらのストレージは、テキストファイルほど効率的ではありません

もう1つは、複数のサブリポジトリ(サブモジュールとして管理)ではなく、1つのリポジトリ(gitの制限)内に膨大な数のファイルがある場合です

git spaceに関するこの記事で、AlBlueは次のように述べています。

Git(およびHg、およびその他のDVCS)は、(大規模な)バイナリがチェックインされてから削除されるという問題に悩まされていることに注意してください。 。

gitリポジトリに大きなバイナリが保存されている場合は、次のことを検討してください。

私は「で説明したようにGit(数とサイズ)内のファイルの制限は何ですか?」、(この答えの後5年間、2015)、より最近のGitのLFSのGitHubからは、それらを格納することで、これらの大きなファイルを(管理する方法である Gitリポジトリ)。


1
gitの大きなファイルのサポートは、大きなバイナリファイル(画像など)が定期的に追加/更新されている場合に役立ちます。git-lfs.github.comを参照してください。実装が非常に簡単で、githubでサポートされています。すべてのチームメンバーが共同で使用するには、インストールする必要があります。
Eric Woods

@EricWoods正しい。前にGit-LFSについて言及しました(64回:stackoverflow.com/search?tab =newest&q=user %3a6309%20git-lfs)。私はそれに応じてこの古い答えを編集しました。
VonC、

ハ、確かに!9歳以上の回答がいかに関連性があるかおかしい(そして、LFS情報を使用すれば今でもなお関係がある)。
Eric Woods

22

はいはい、git gc当然、解決策です、

そしてローカル-ローカルリポジトリを削除して再度複製することができます、

ここにはもっと重要なものがあります...

その巨大なgitと外部が処理するのを待つ秒数は、数分に渡って収集され、数時間の非効率的な時間が費やされます。

ファイルの最新バージョンのみを含め、新しい(完全に、ブランチだけでなく)リポジトリを最初から作成します。当然、すべての履歴が失われます。

しかし、コードの世界では感傷的になる時間ではないので、5年間のコード全体をコミットまたは差分ごとにドラッグしても意味がありません。懐かしくなれば、古いgitと外部をどこかに保存できます:]

しかし、ある時点であなたは本当にそれに沿って動く必要があります:]

あなたのチームはあなたに感謝します!


12
完全に同意します。最近このアプローチを古いリポジトリで採用し、振り返っていません。
ええと

13

このコマンドを実行すると非常に危険ですが、すべてのgitリカバリ/バックアップファイルを消去してリポジトリを縮小します。

git reflog expire --expire=now --all && git gc --prune=now --aggressive

gitが不良コマンドからリポジトリを復元するために使用するすべてのファイルが消去されます。たとえば、を実行した場合git reset --hard、通常は失われたファイルを復元できます。しかしgit reset --hardgit reflog expire...コマンドの前に行うと、すべてが失われます。さて、あなたの唯一の望みは、ファイルシステムを分析するツールを使用して、上書きされていない場合は、消去されたファイルを回復することです。


3
私はこれを極端に危険だとは思いません。私はあなたが注意しなければならないものにラベルを付けます。私の経験では、reflogまたは到達できないオブジェクトに触れることはほとんどありません。ほとんどが、そこにあるか、またはオブジェクトと対話する方法すら知らないため、それらが役立つ状況で動けなくなったり、ひどく物事を行ったりします。非効率的な方法。これらのコマンドが何を実行するのかわからなくて理解できない場合は、安全に実行できると私は言っています。
Chris Morgan、

10

git clean -d -f -i それを行うための最良の方法です。

これは、より制御された方法でクリーニングするのに役立ちます。

-i インタラクティブの略です。


3
OPの質問は曖昧で、これはその点で良い答えですが、それgit cleanは、ディレクトリをクリーンアップするほどリポジトリをクリーンアップするためではないことを指摘しておきたいと思います。盲目的にコピー/貼り付けを行うユーザーには注意してください。これにより、ローカルで実際に必要になる可能性のある追跡されていないファイル/ディレクトリが削除されます。
sraboy 2018

git clean -d -x -fは、ディープクリーンをしたい場合にうまく機能します
Rishabh Jain

2

それが縮小するかどうかはわかりませんが、を実行した後git clean、私も頻繁に縮小し、git repack -adパックファイルの数を減らします。


5
再梱包はgit gcプロセスの一部であるため、個別に実行する必要はありません
artkoshelev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.