# Data Model Seafile internally uses a data model similar to GIT's. It consists of `Repo`, `Branch`, `Commit`, `FS`, and `Block`. ## Repo A repo is also called a library. Every repo has an unique id (UUID), and attributes like description, creator, password. ## Branch Unlike git, only two predefined branches is used, i.e., `local` and `master`. In PC client, modifications will first be committed to the `local` branch. Then the `master` branch is downloaded from server, and merged into `local` branch. After that the `local` branch will be uploaded to server. Then the server will fast-forward its `master` branch to the head commit of the just uploaded branch. When users update a repo on the web, modifications will first be committed to temporary branch on the server, then merged into the `master` branch. ## Commit Like in GIT. ## FS There are two types of FS objects, `SeafDir Object` and `Seafile Object`. `SeafDir Object` represents a directory, and `Seafile Object` represents a file. ## Block A file is further divided into blocks with variable lengths. We use Content Defined Chunking algorithm to divide file into blocks. A clear overview of this algorithm can be found at http://pdos.csail.mit.edu/papers/lbfs:sosp01/lbfs.pdf. On average, a block's size is around 1MB. This mechanism makes it possible to deduplicate data between different versions of frequently updated files, improving storage efficiency. It also enables transferring data to/from multiple servers in parallel.