---
title: リポジトリ
description: リポジトリとは何か、置き場に何が求められるか、何をホストに任せるか。
---

リポジトリは、置き場の 1 つのプレフィックスの下にあるもの全部です。S3・R2・ほかの S3 互換ストレージの `s3://bucket/lake/` か、ディスク上のフォルダです。サーバー上の Git の bare リポジトリにあたります。索引ファイルも、リポジトリを持つプロセスもありません。読み手も書き手も、[仕様](/ja/spec)の決まりに従って同じファイルを扱います。

## 置き場に求めること

| 操作 | 使う人 | 用途 |
| --- | --- | --- |
| オブジェクトを読む | 読み手と書き手 | ref、`version.json`、カタログ、データファイル |
| オブジェクトを書く | 書き手 | データファイル、カタログ、`version.json` |
| 条件付きで書く | 書き手 | ref: 無いときだけ作る、変わっていないときだけ置き換える |
| プレフィックスの一覧を取る | 保守 | どのバージョンも参照していないデータファイルを探す |
| 消す | 保守 | 保持期間を過ぎたバージョンのカタログと、使われていないデータファイル |

2 人の書き手を安全にするのが条件付き書き込みです。ref は `If-None-Match: *` で作り、`If-Match: <読んだときの ETag>` で動かします。その間にほかの人が動かしていれば、置き場は書き込みを断り、何も変わりません。S3 と R2 はこれに対応しています。フォルダの置き場はロックを取らずに条件を確かめるので、書き手が 1 人のときに使ってください（[置き場](/ja/guides/stores)を参照）。条件付き書き込みのない置き場からは読めますが、push してはいけません。最後に書いた人が、ほかの人のバージョンを黙って置き換えてしまいます。

読み手は読むだけです。リポジトリの前に静的な HTTP サーバーを置けば足ります。

## リポジトリの中身

```
<root>/
  fdl.json                 設定: 形式のバージョン、ID、データファイルの場所
  HEAD                     既定のブランチ
  refs/heads/<name>        ブランチ
  refs/tags/<name>         タグ
  versions/<ID>/           バージョンごとのフォルダ
  data/                    Parquet ファイル。全バージョンで共有
  sources/<sha256>         バージョンを作った元のファイル（任意）
```

リポジトリには、バージョンのフォルダの外にカタログを置きません。作業カタログも置きません。どちらも、公開していない状態を読み手に渡してしまいます。

`fdl.json` には `id` があります。`fdl init` が一度だけ書く UUID です。ほかのホストに置いた写しも同じ `id` を持つので、2 つの URL が同じリポジトリだと分かります。リポジトリを預かるサービスは、自分のデータセットの ID をここに書いてもかまいません。

## FDL がホストに任せること

FDL が決めるのはファイルのことです。誰が読めるか、誰が `main` を動かせるか、URL がどんな形かは決めません。それはリポジトリを預かる側が決めます。

- 権限。1 つのリポジトリの中身は、すべて同じ人が読めます。データセットの一部だけを公開するときは、リポジトリを 2 つに分けます（[公開と非公開](/ja/guides/public-and-private)を参照）
- 承認。ホストは書き手に ref を動かさせず、確認したあとで自分で動かしてもかまいません（[ホストを作る](/ja/guides/building-a-host)を参照）
- 認証、URL の形、バージョンを残す期間

形式の中に、ホストやサービスの名前は出てきません。リポジトリは、ファイルを写せば別のホストへ移せます。
