ちょっといろいろ調べ物をしていて、gitリポジトリを移動したり、複数の場所にある同一リポジトリを同期化するときに、git bundleを使用すると便利そうだったので、その方法をまとめておく。
GitHubのbundleコマンドは、複数のGitリポジトリのコミット履歴やファイルを1つのバイナリファイルにまとめることができる非常に便利な機能である。
bundleの主な利点
1. オフライン環境でのコード共有
- インターネット接続が不安定な環境でも、完全なリポジトリの共有が可能
- セキュリティ要件の厳しい環境下でも、USBなどの物理メディアを介してコードの受け渡しが実現可能
- チーム間での効率的なコードレビューが促進される
2. 完全なリポジトリ転送
- コミットログ、ブランチ情報、タグなどのメタデータを含めた完全なバックアップが可能
- 特定の期間のコミット履歴のみを選択的に抽出することも可能
- マージ履歴や変更の追跡情報も維持される
3. 効率的なネットワーク利用
- 差分ではなく、必要な情報のみを圧縮して単一ファイルに格納
- 大規模なリポジトリでも転送サイズを最小限に抑えることが可能
- 帯域幅の制限がある環境での作業効率が向上
gitのリポジトリをまとめ上げる機能としては、git archiveやtarコマンドなどがあるが、それらとの違いは以下の通りである。
- git archive: 特定の時点のファイルのスナップショットのみを保存する機能で、コミット履歴やブランチ情報は含まれない。
- 一方でgit bundleは完全なリポジトリ情報(コミット履歴、ブランチ、タグなど)を保持できる
- tarコマンド: .gitディレクトリを含めて圧縮することは可能だが、Gitに最適化されていない汎用的なアーカイブツール
- 圧縮効率や転送に関してGit特有の最適化が行われていない
- git bundleはGitリポジトリ専用のフォーマットで、効率的な転送と展開が可能
基本的な使用方法
1. バンドルの作成
とあるリポジトリのバンドルを作成するとする。
git bundle create bundle.bundle --all
これで、リポジトリのすべてのコミット履歴やファイルがbundle.bundleというファイルにまとめられる。
2. バンドルの受け取り
バンドルを受け取る側では、以下のようにしてバンドルを受け取る。
git clone bundle.bundle
これで、バンドルの内容がリポジトリに展開される。ここでのポイントは、bundleファイル自体がgitリポジトリであるということである。
これが便利な点は、異なるサーバ間で直接やり取りができない場合、一方のリポジトリをbundleにして、もう一方のリポジトリにインポートすることができる点である。 bundle化したファイルはgitのリポジトリそのものであるため、他のリモートリポジトリとシームレスに接続することができる。
git clone bundle.bundle # Bundleの中身を展開 git remote add upstream git@github.com:username/repository.git # リモートリポジトリを追加 git fetch upstream # リモートリポジトリの内容を取得
とすると、別の場所にいた同じリポジトリを簡単にシンクロさせることができる。