Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新(準備中)

May 8, 2025 - 日記

gitcache:大規模リポジトリの操作を高速化するローカルキャッシュツール

大規模なGitリポジトリを扱う場合や、同じリポジトリの複数のクローンを作成する場合、ネットワーク帯域幅とディスク容量の消費が問題になることがあります。今回は、これらの問題を解決するための便利なツール「gitcache」を紹介します。

gitcacheとは

gitcache は、Gitリポジトリのローカルキャッシュを提供するツールです。大規模なリポジトリや複数のクローンを扱う際のパフォーマンスを向上させることを目的としています。

基本的な考え方は、ローカルにベアミラーを作成し、必要に応じて更新して、それを複数のローカルリポジトリのソースとして使用するというものです。

主な機能

  • gitコマンドのラッパーとして動作し、簡単に統合できます
  • git-lfs のサポート
  • ミラーの更新間隔をカスタマイズ可能(明示的なリクエスト時のみ更新するオプションも)
  • gitcacheコマンドで利用可能な統計情報
  • すべてのミラー関連操作にタイムアウト設定が可能
  • 環境変数、グローバル設定ファイル、設定ごとの設定ファイルによる構成

動作の仕組み

gitcacheはgitコマンドのラッパーとして設計されています。例えば、ユーザーが初めて以下のコマンドを実行すると:

git clone https://github.com/seeraven/gitcache.git

リポジトリhttps://github.com/seeraven/gitcache.gitがベアミラー$GITCACHE_DIR/mirrors/github.com/seeraven/gitcache/gitにクローンされ、その後、gitコマンドが以下のように書き換えられます:

git clone $GITCACHE_DIR/mirrors/github.com/seeraven/gitcache/git gitcache

これによりクローンが作成されます。さらに、クローンのプッシュURLはアップストリームURLに調整されます。

ユーザーが同じリポジトリの別のgit cloneコマンドを実行すると、ミラーが更新され(更新戦略が許可する場合)、ローカルクローンが前と同様に作成されます。

ユーザーがそのローカルクローンでgit pullgit fetchを実行すると、gitcacheはリポジトリがgitcacheによって処理されているかどうかをチェックします(プルURLがミラーを指し、プッシュURLがアップストリームURLを指している場合)。処理されている場合、最初にミラーを更新し(更新戦略に従って)、その後元のコマンドを実行します。

インストール方法

gitcacheはpyInstaller を使用して単一の実行ファイルとして配布されています。Linuxの場合、以下のようにインストールできます:

wget https://github.com/seeraven/gitcache/releases/download/v1.0.28/gitcache_v1.0.28_Ubuntu22.04_x86_64
mv gitcache_v1.0.28_Ubuntu22.04_x86_64 ~/bin/gitcache
chmod +x ~/bin/gitcache

gitcacheは単独のコマンドとして使用できますが、gitのラッパーとして使用する方が簡単です。シンボリックリンクを作成し、PATH変数を調整して、ラッパーが実際のgitコマンドの前に見つかるようにします:

ln -s gitcache ~/bin/git
export PATH=$HOME/bin:$PATH

export文は永続的に設定するために~/.bashrcファイルに追加するとよいでしょう。

設定方法

gitcacheはデフォルトで~/.gitcacheディレクトリにすべてのファイルを保存します。このベースディレクトリはGITCACHE_DIR環境変数を設定することで変更できます。GITCACHE_DIRが作成されると、デフォルト設定ファイルGITCACHE_DIR/configが作成され、デフォルト値が設定されます。

現在の設定は以下のコマンドで確認できます:

gitcache

各項目には、設定ファイルの設定を上書きするために使用できる対応する環境変数があります。

主な設定オプションには以下のようなものがあります:

  • ミラー更新間隔(GITCACHE_UPDATE_INTERVAL
  • クリーンアップ期間(GITCACHE_CLEANUP_AFTER
  • コマンドタイムアウト(GITCACHE_COMMAND_LOCK_TIMEOUT
  • クローンスタイル(GITCACHE_CLONE_STYLE
  • URL パターン(GITCACHE_URLPATTERNS_INCLUDE_REGEXGITCACHE_URLPATTERNS_EXCLUDE_REGEX

実用例

1. 大規模リポジトリの複数クローン

大規模なリポジトリを複数回クローンする必要がある場合、gitcacheを使用すると、最初のクローン後の操作が大幅に高速化されます。

# 最初のクローン(通常の速度)
git clone https://github.com/large-org/large-repo.git

# 2回目以降のクローン(高速)
git clone https://github.com/large-org/large-repo.git large-repo-copy

2. CIサーバーでの使用

CIサーバーでは、同じリポジトリを何度もクローンする必要があることがよくあります。gitcacheを使用すると、ネットワーク帯域幅を節約し、ビルド時間を短縮できます。

# 更新間隔を負の値に設定して、明示的なリクエスト時のみ更新するように設定
export GITCACHE_UPDATE_INTERVAL="-1"

# 必要に応じてミラーを明示的に更新
git update-mirrors

# 通常のgit操作(ミラーから高速に取得)
git clone https://github.com/our-org/our-repo.git

3. 古いミラーのクリーンアップ

長期間使用していないミラーは、ディスク容量を節約するためにクリーンアップできます:

git cleanup
# または
gitcache -c

まとめ

gitcacheは、大規模なGitリポジトリや複数のクローンを扱う開発者やチームにとって非常に便利なツールです。ネットワーク帯域幅の使用を最適化し、操作を高速化することで、開発ワークフローを効率化します。特に、CI/CD環境や大規模なモノレポを扱うチームにとって、大きなメリットをもたらすでしょう。

セキュリティの観点から、gitcacheは現在のユーザーのみがリポジトリをキャッシュするように設計されています。他のユーザーがリモートリポジトリにアクセスする権限を持っているかどうかわからないため、ミラーリングされたGitリポジトリを他のユーザーと共有しないことをお勧めします。