同期と複数リポジトリ

バンドルとアーカイブ

リポジトリを 1 つのファイルにまとめる方法は 2 つあります。どちらも同じように 見えますが同じではなく、間違ったほうを選んでしまうことこそ、このページが存在 する理由のすべてです。

バンドル アーカイブ
中身 履歴: コミット、ブランチ、タグ あるコミット時点のファイル
開く手段 git clone / git fetch — それ自体がリモート 任意の解凍ツール
その後 もう一度フェッチしたり、マージしたり、作業を続けられる 何もない。ただのスナップショット
用途 ネットワークのないマシンへ作業を運ぶ 「v2.1 のソースを送って」

⌘K → リポジトリをバンドル または アーカイブを書き出す。

リポジトリを 1 つのファイルにまとめる画面。範囲の指定も用意されている

バンドル

バンドルは、どんなネットワークもまたげない隙間に対する 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 が効くのはアーカイブだけです。 クローンやバンドル、履歴から 何かを隠すものではありません — それには 履歴からファイルを削除する を参照してください。

関連項目: フェッチ、プル、プッシュ · 安全な共有 · 履歴からファイルを削除する

この翻訳を GitHub で改善