バンドルとアーカイブ
リポジトリを 1 つのファイルにまとめる方法は 2 つあります。どちらも同じように 見えますが同じではなく、間違ったほうを選んでしまうことこそ、このページが存在 する理由のすべてです。
| バンドル | アーカイブ | |
|---|---|---|
| 中身 | 履歴: コミット、ブランチ、タグ | あるコミット時点のファイル |
| 開く手段 | git clone / git fetch — それ自体がリモート |
任意の解凍ツール |
| その後 | もう一度フェッチしたり、マージしたり、作業を続けられる | 何もない。ただのスナップショット |
| 用途 | ネットワークのないマシンへ作業を運ぶ | 「v2.1 のソースを送って」 |
⌘K → リポジトリをバンドル または アーカイブを書き出す。

バンドル
バンドルは、どんなネットワークもまたげない隙間に対する git の答えです。
ネットワークから切り離されたマシン、USB メモリ、メールの添付、飛行機の中の
ノート PC。受け取った側は git clone work.bundle myrepo を実行すれば、あなたの
履歴とブランチを持った本物のリポジトリが手に入り、そのファイルをサーバーである
かのようにフェッチできます。
範囲は 3 種類です。
| 範囲 | 何が運ばれるか | サイズ |
|---|---|---|
| すべて | あらゆるブランチとタグ、完全な履歴 | リポジトリ全体 |
| 1 つのブランチまたはタグ | その ref と、そこから辿れるものすべて | たいてい大部分 |
| コミットの範囲 | 2 つの端の間にあるものだけ | 小さい |
範囲バンドルは履歴のパッチであって、リポジトリではありません。 遠いほうの 端を前提として記録するため、git はそのコミットをまだ持っていないリポジトリで これを開くことを拒みます。新しいコミットをつなぐ先がないからです。これは正しい 挙動であり、初めて出会うと驚く挙動でもあります。範囲を使うのは、相手側があなたの 作業をある地点まですでに持っているときです — 相手が最後に受け取ったタグ、二人が 分岐した元のコミットなどです。
受け取る側
バンドルをインポート… はファイルを読み、中身を一覧し、このリポジトリで 使えるかどうかを最初に伝えます。前提となるコミットが足りなければ、あとから git 自身の言い回しで失敗するのではなく、何件足りないかを教えてくれます。
インポートされた ref は、リモート追跡の名前空間の bundle/… の下に入ります。
ローカルのものは何も動きません。ブランチが fast-forward されることも、作業が
上書きされることもありません。そのうえで、他のリモートのブランチとまったく同じ
ように、自分のタイミングで bundle/main をマージしたり、リベースしたり、
チェックアウトしたりします。
バンドルから新しいリポジトリを起こしたい場合は、ターミナルでそのファイルから
クローンしてください: git clone work.bundle myrepo。Gitcito は開いている
リポジトリへインポートするだけで、ファイルからクローンはしません。
アーカイブ
git archive は、あるコミット時点のツリーを zip または tarball として書き出し
ます。.git はなく、履歴もなく、そこからフェッチする方法もありません — そして
それこそが、受け取る相手に渡すべきものがリポジトリではなくソースコードである
ときの狙いです。
| 選択肢 | 何をするか |
|---|---|
| リファレンス | 書き出すブランチ、タグ、コミット。ふつうはタグ |
| 形式 | zip、tar.gz、tar |
| ディレクトリで包む | 最上位のフォルダーを 1 つ足し、展開してもファイルが散らからないようにする |
| このパスだけ | ツリー全体ではなく、サブディレクトリを 1 つだけ書き出す |
export-ignore こそ、これを使う理由
リポジトリは .gitattributes でパスに印を付けられます。
.github/ export-ignore
test/ export-ignore
*.psd export-ignore
これらのパスはリポジトリには残ったまま、あらゆるアーカイブから外されます。 プロジェクトが CI 設定やフィクスチャ、200 MB のデザインファイルを含まない リリース用 tarball を出せるのはこの仕組みで、しかもそのルールは誰かのリリース スクリプトではなくリポジトリの中に置かれます。
知っておくべき制限
- バンドルは完全なコピーです — 範囲を使わないかぎり。2 GB のリポジトリを バンドルすれば 2 GB のファイルが書き出され、クローンと同じだけ時間がかかります。
- 空のバンドルを拒むのは git であって Gitcito ではありません。 両端の間に 何もない範囲は、役に立たないファイルではなくエラーになります。
- インポートはマージしません。 ref は
bundle/…の下に届き、あなたが何かを するまでそこに留まります。 - アーカイブに履歴はないので、リポジトリに戻すことはできません。相手が コミットする必要があるなら、バンドルを送ってください。
export-ignoreが効くのはアーカイブだけです。 クローンやバンドル、履歴から 何かを隠すものではありません — それには 履歴からファイルを削除する を参照してください。
関連項目: フェッチ、プル、プッシュ · 安全な共有 · 履歴からファイルを削除する