どのくらいの頻度でgit-gcを使用すべきですか?


233

どのくらいの頻度でgit-gcを使用すべきですか?

マニュアルページは、単純に言います:

ユーザーは、各リポジトリ内でこのタスクを定期的に実行して、ディスク領域の使用率と運用パフォーマンスを維持することをお勧めします。

オブジェクトの数を取得して、GCの時間かどうかを確認するコマンドはありますか?


これらのようなタスク(Linuxを使用している場合)のcronのための主要な候補であるminhajuddin.com/2011/12/09/...
Khaja Minhajuddin

1
注:設定gc.autodetach(Git 2.0 Q2 2014)はgit gc --auto、ユーザーを壊さずに実行するのに役立ちます。以下の私の答えを参照しください。
VonC 2014年

回答:


204

これは主に、リポジトリが使用される量に依存します。1人のユーザーが1日に1回チェックインし、ブランチ/マージ/その他の操作を週に1回行うので、おそらく1年に1回以上実行する必要はありません。

数十人の開発者が1日に2〜3回チェックインする数十のプロジェクトに取り組んでいるので、毎晩実行することができます。

ただし、必要以上に頻繁に実行しても問題はありません。

私がやろうとしていることは、今それを実行し、それから1週間後にディスク使用率を測定し、再度実行して、ディスク使用率を再度測定することです。サイズが5%低下した場合は、週に1回実行します。それがさらに落ちる場合は、より頻繁に実行してください。低下が少ない場合は、実行頻度を減らします。


17
マニュアルによると、「一部のgitコマンドは、多くの緩いオブジェクトを作成する可能性のある操作を実行した後にgit gc --autoを実行します。」実際に実行するコマンドを知っている人はいますか?
ジョシュアダンス

2
多くのコミットが新しい履歴に書き直されるため、大規模なgit rebaseは明らかな例です。現在のブランチの一部である古いコミットがリポジトリに残っています
mafrosis

20
「必要以上に頻繁に実行しても害はない」...私は完全に同意しません。アリストテレスが指摘しているように、ぶら下がっているコミットは優れたバックアップメカニズムを作ることができます。
Jason Baker、

105

リポジトリのガベージコレクションの欠点は、ガベージが収集されることです。私たち皆がコンピューターユーザーとして知っているように、私たちが現在ゴミと見なすファイルは、3日後に非常に貴重なものになる可能性があります。gitが残骸のほとんどを保持しているという事実は、私のベーコンを数回節約しました-ぶら下がっているすべてのコミットを参照することで、誤って缶詰にしていた多くの作業を回復しました。

だから、あなたのプライベートなクローンにきちんとしたフリークになりすぎないでください。それはほとんど必要ありません。

OTOH、データの復旧可能性の価値は、主にリモートとして使用されるリポジトリに疑問があります。すべての開発者がプッシュしたりプルしたりする場所。そこで、GCの実行と再パックを頻繁に開始するのが賢明な場合があります。


38
FWIWのすべての緩いオブジェクトがガベージコレクションされるわけではなく、デフォルトで2週間より古いオブジェクトのみです(git gc --help特に、--pruneオプションを参照)。についての説明もありgc.reflogExpireます。このため、過去90日間に訪問したコミットメントは収集されないと思います。(私のgitバージョン:v1.7.6)
RobM、2011

30

gitの最近のバージョンでは、必要に応じてgcが自動的に実行されるため、何もする必要はありません。man git-gc(1)の「オプション」セクションを参照してください:「一部のgitコマンドは、多数のルーズオブジェクトを作成する可能性のある操作を実行した後にgit gc --autoを実行します。」


13
数年前のリポジトリで初めて実行したところ、.gitは16Mから2.9Mになり、サイズが82%削減されました。したがって、コマンドを手動で実行することは依然として便利なようです。
Darshan Rivka Whittle 2015

@DarshanRivkaWhittle数年でgitを更新しましたか?
std''OrgnlDave

1
@ std''OrgnlDaveええ、私は常にArchの最新バージョンを実行していました。私はもう一度実行しました。おそらく最後のコメントから初めて(コメントを思い出させてくれたおかげで)、私の.gitは81Mから13Mになりました。実行するコマンドは実行しgc --autoないでください。
Darshan Rivka Whittle

18

Git-Guiを使用している場合は、いつ心配する必要があるかがわかります。

This repository currently has approximately 1500 loose objects.

次のコマンドは同様の数をもたらします:

$ git count-objects

ソースを除いて、git-guiはそれ自体で計算を行い、実際には.git/objectsフォルダーで何かを数え、おそらく近似をもたらします(tcl適切に読み取ることはわかりません!)。

いずれの場合においても、思われる任意の数に基づいて、警告を与えるために周りに 300個の緩いオブジェクトを。


実際には警告しますが、gcを実行させると、ほとんどの場合、gcは何もしません。したがって、それを行うためにgit guiに依存することは、常に6000を超える緩いオブジェクトを待つことであり、常にgcを実行して1分間待つかキャンセルする必要があります:/おそらく誰かがgit guiを修正して最大緩みをチェックする必要がありますオブジェクト数。制限に達するまでダイアログを表示する必要はありません。
mlatu 2014

はい@mlatu同意します。私がこれを書いたとき、私はそれに注目したかっただけです。両方ともGit-Guicount-objectsここでの質問に対する正確な回答ではありません...しかし、それらは正しいはずです!
cregox 14

私はこれが悪い答えだと言ったのではなく、ほとんどの場合git guiは何もしないことを指摘したかっただけです。git gcは、十分な場合があるか、アグレッシブスイッチを使用した場合を除いて、あまり機能しないと思います。
mlatu 14


7

大きなチェックアウトを行った後、git gcを使用して、新しいオブジェクトをたくさん用意しました。スペースを節約できます。たとえば、git-svnを使用して大きなSVNプロジェクトをチェックアウトし、git gcを実行すると、通常、多くのスペースを節約できます


これはまだ本当ですか?'08年でさえ、HDDスペースは安かったので、それを実行の正当化として使用しても意味がないようです
Thymine

7

新しい(Git 2.0 Q2 2014)設定で、中断することなくそれを行うことができますgc.autodetach

commit 4c4ac4dcommit 9f673f9NguyễnTháiNgọcDuy、別名pclouds)を参照してください。

gc --auto時間がかかり、ユーザーを一時的にブロックする可能性があります(ただし、それほど煩わしくはありません)。
それをサポートするシステムのバックグラウンドで実行するようにします。
バックグラウンドでの実行で失われる唯一のものは、プリントアウトです。しかしgc output、本当に面白いわけではありません。
を変更することで、フォアグラウンドに保つことができgc.autodetachます。


その2.0リリース以降、バグがありましたが、git 2.7(2015年第4四半期)ではエラーメッセージが失わないようになっています
参照してください329e6e8コミットにより(2015年9月19日)のグエンタイ・ゴックDuyと(pclouds
(合併によりJunio C浜野- gitster-076c827コミットし、2015年10月15日)を

gc:デーモン化されたものからログを保存しgc --auto、次回印刷する

一方でコミット9f673f9gc:実行するための設定オプション--autoバックグラウンドで- 2014年2月8日)は「に関するいくつかの苦情減らすことができますgc --auto」末端を占有し、それが問題の別のセットを作成します。

このセットの最新のものは、デーモン化の結果としてstderr閉じられ、すべての警告が失われます。の最後に表示されるこの警告は、cmd_gc()gc --auto」の繰り返し実行を回避する方法をユーザーに通知するため、特に重要です。
stderrが閉じているため、ユーザーにはわかりません。当然、「gc --auto」がCPUを浪費していると文句を言います。

デーモン化gcはに保存さstderr$GIT_DIR/gc.logます。
以下gc --autogc.log、ユーザーが削除するまで実行および印刷されませんgc.log


6

この引用は、 Gitによるバージョン管理

Gitはガベージコレクションを自動的に実行します

•リポジトリに緩いオブジェクトが多すぎる場合

•リモートリポジトリへのプッシュが発生したとき

•多くの緩いオブジェクトを導入する可能性があるいくつかのコマンドの後

•git reflogなどの一部のコマンドが期限切れになり、明示的に要求した場合

そして最後に、git gcコマンドを使用して明示的に要求すると、ガベージコレクションが発生します。しかし、それはいつなのでしょうか?この質問に対する明確な答えはありませんが、いくつかの良いアドバイスとベストプラクティスがあります。

いくつかの状況では、git gcを手動で実行することを検討する必要があります。

•git filter-branchを完了したばかりの場合。filter-branchは多くのコミットを書き換え、新しいコミットを導入し、結果に満足したら削除すべき参照に古いコミットを残していることを思い出してください。それらのすべての死んだオブジェクト(それらを指す1つの参照を削除したため参照されなくなった)は、ガベージコレクションを介して削除する必要があります。

•多くの緩いオブジェクトを導入する可能性があるいくつかのコマンドの後。これは、たとえば、大規模なリベース作業になる可能性があります。

反対に、ガベージコレクションに注意する必要があるのはいつですか。

•回復したい孤立した参照がある場合

•git rerereのコンテキストでは、解像度を永久に保存する必要はありません

•Gitがコミットを永続的に保持するのに十分なタグとブランチのみのコンテキストで

•FETCH_HEAD取得(git fetchによるURL直接取得)のコンテキストでは、ガベージコレクションの対象となるため


2
(の結果としてgit commit --amend)ツリーに到達できないコミットがあります。これはで確認できますgit log --reflog。ブランチをリモートリポジトリにプッシュし、ツリーをもう一度チェックしました。到達できないコミットがまだ残っていました。どうやらgit gcこのプッシュが起こったときに実行されませんでした。…?
chharvey 2016

4

大きなコミットを行うときに使用します。何よりも、リポジトリからより多くのファイルを削除するときに使用します。その後、コミットの方が高速です


1

あなたは使用する必要はありませんgit gcので、非常に多くの場合git gc(ガベージコレクション)がいくつかの頻繁に使用するコマンドで自動的に実行されます。

git pull
git merge
git rebase
git commit

出典:git gcのベストプラクティスとFAQ

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