リポジトリのメンテナンスと整理
`git gc`や`git prune`などのコマンドを使って、ローカルGitリポジトリを整理・最適化します。
「リポジトリのメンテナンスと整理」はCoddyKit上の無料Git & GitHub Professional Workflowレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGit & GitHub Professional Workflow学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Git & GitHub Professional Workflowコースには全4レッスンが含まれています。
Gitのハウスキーピングへようこそ
時間が経つと、ローカルGitリポジトリには不要なファイルがたまり、効率が低下することがあります。散らかった部屋のようなものです。
このレッスンでは、git gcやgit pruneなどの強力なコマンドを使って、Gitリポジトリを整理し最適化する方法を学びます。これにより、プロジェクトをスムーズに実行できます。
Gitのオブジェクトストアを理解する
まず、Gitがデータをどのように保存するかを理解しましょう。Gitはプロジェクトの履歴を、次のような「オブジェクト」の集合として保存します。
- Blobs:ファイルの内容
- Trees:ディレクトリとその内容
- Commits:ある時点でのプロジェクトのスナップショット
- Tags:特定のコミットを指すポインター
これらのオブジェクトは「loose objects」として保存することも、効率化のために「packfiles」に圧縮することもできます。
`git gc`(ガベージコレクション)の紹介
git gcコマンドは「garbage collect(ガベージコレクション)」を意味します。Gitに組み込まれた、リポジトリを整理して最適化するためのツールです。
主な処理は次のとおりです。
- loose objectsのパッキング:個々のオブジェクトを1つのpackfileに圧縮します。
- 到達不能なオブジェクトのプルーニング:コミット、ブランチ、タグのいずれからも参照されなくなったオブジェクトを、一定期間経過後に削除します。
- 古いpackfileの削除:古くなった圧縮オブジェクトファイルを削除します。
この処理によって、リポジトリのサイズが小さくなり、動作が速くなります。
`git gc`を実行する(一般的な使い方)
git gcはいつでも手動で実行できます。また、Gitはpushやfetchなど特定の操作を行ったときに、バックグラウンドで自動的に実行することもあります。
通常は安全に実行できますが、大規模な整理を行う前に、復旧が必要になる可能性のある未コミットの作業がないことを確認するのがよいでしょう。
ターミナルで実行してみましょう。
git gc`git gc`の出力を理解する
git gcを実行すると、次のような出力が表示されます。
Counting objects: 1234, done.
Compressing objects: 100% (987/987), done.
Writing objects: 100% (1234/1234), done.
Total 1234 (delta 567), reused 0 (delta 0)
Removing duplicate objects: 100% (256/256), done.
Pruning objects: 100% (123/123), done.これは、Gitがオブジェクトをパックし、新しいpackfileを書き込み、古く到達不能なオブジェクトをプルーニング(削除)していることを示しています。数値はリポジトリの状態によって異なります。
`git prune`に注目
git gcは多くのクリーンアップ処理を行いますが、git pruneは特に「ダングリング」オブジェクトや「到達不能」オブジェクトの削除を担当します。
- ダングリングオブジェクト: リポジトリ内には存在するものの、どのコミット、ブランチ、タグからも参照されておらず、パックファイルにも含まれていないオブジェクトです。
- 到達不能オブジェクト: ダングリングオブジェクトと似ていますが、より広い意味を持つ用語です。履歴を書き換える rebase や reset の後など、さまざまな理由で存在することがあります。
git pruneは、デフォルトの有効期限(通常は2週間)より古いこれらのオブジェクトを削除します。
`git prune`を直接実行する
通常、git gcがgit pruneを呼び出すため、git pruneを直接実行する必要はありません。ただし、より対象を絞ったクリーンアップには使用できます。
実際には何も削除せずにgit pruneの実行内容を確認するには、--dry-runオプションを使用します。
git prune --dry-run有効期限を指定したプルーニング
デフォルトでは、git prune(およびgit gcのプルーニング手順)は、2週間より古いオブジェクトのみを削除します。--expireオプションを使用すると、この設定を上書きできます。
これは、実験的な rebase を行った後など、直近に作成されたダングリングオブジェクトを積極的にクリーンアップしたい場合に便利です。その rebase を元に戻す必要がないと確信できる場合に使用します。
たとえば、1日より古いオブジェクトをプルーニングするには、次のようにします。
git prune --expire=1.day`git reflog expire`との違い
git pruneとgit reflog expireを混同しないことが重要です。どちらもクリーンアップに関係しますが、目的は異なります。
git prune: オブジェクトデータベースから実際のGitオブジェクト(blob、tree、commit)を削除します。git reflog expire: reflog(HEADがこれまで指していた場所のローカル履歴)のエントリをクリーンアップします。これにより特定のコミットが見つけにくくなりますが、オブジェクト自体は削除されません。
履歴を変更したり、クリーンアップコマンドを実行したりする際は、常に注意してください。
ハウスキーピングの確認
git gcの主な役割を最もよく説明しているものは、次のうちどれですか?
まとめと次のステップ
おめでとうございます。Gitリポジトリを整理し、効率的に保つ方法を学びました。
git gc: ガベージコレクション、オブジェクトのパッキング、プルーニングをまとめて行うコマンドです。git prune: 指定した有効期限より古い、到達不能またはダングリング状態のオブジェクトを対象として削除します。
定期的にメンテナンスを行うと、Gitのワークフローをスムーズに保ち、リポジトリが過剰なディスク容量を消費するのを防げます。この調子で進めてください。
よくある質問
「リポジトリのメンテナンスと整理」レッスンは無料ですか?
はい。「リポジトリのメンテナンスと整理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Git & GitHub Professional Workflowコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Git & GitHub Professional Workflowコースには全4レッスンが含まれています。
「リポジトリのメンテナンスと整理」で何を学びますか?
`git gc`や`git prune`などのコマンドを使って、ローカルGitリポジトリを整理・最適化します。 ブラウザで直接実行するハンズオンコードでGit & GitHub Professional Workflowを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Git & GitHub Professional Workflowを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのGit & GitHub Professional Workflowは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「リポジトリのメンテナンスと整理」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このGit & GitHub Professional Workflowレッスンでコードを書いて実行できますか?
はい。すべてのGit & GitHub Professional Workflowレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Git Reflogと履歴の復元
- デバッグのためのGit Bisect
- リポジトリのメンテナンスと整理
- git filter-repo で履歴を書き換える