1. A method comprising: maintaining, in a content-addressable data store, a tree-structured index that maps file paths of files in a directory structure to unique file identifiers of files in the content-addressable data store, wherein each node in the tree-structured index is a file in the content-addressable data store, wherein each file of a project snapshot has a respective unique file path in the directory structure of a file system separate from the content-addressable data store and the tree-structured index includes an identifier for each of a plurality of files in the project snapshot, wherein each content-addressable file is stored in the content-addressable data store at a location identified by a unique file identifier that is generated based on contents of the file, wherein the tree-structured index comprises a root node representing a root level of the tree-structured index, a plurality of parent nodes representing N−1 intermediate levels of the tree-structured index, and a plurality of leaf nodes representing a leaf level of the tree-structured index, wherein each non-leaf node stores a plurality of unique file identifiers of nodes descendant from the non-leaf node in the tree-structured index, the plurality of unique file identifiers being stored at corresponding offsets within the non-leaf node, wherein each leaf node stores an entry for each file of one or more files of the project snapshot, wherein each entry for each file comprises a unique file identifier for retrieving the file from the content-addressable data store, and a file path hash comprising N hash characters of a hash of the file path of the file, and wherein each leaf node stores respective entries for files having different file paths and N identical characters in respective file path hashes for the files; receiving a request to retrieve a unique file identifier corresponding to a file path of a particular file in the directory structure of the file system separate from the content-addressable data store; generating a file path hash of the file path; obtaining at least N hash characters from the file path hash of the file path; obtaining, for the project snapshot, a unique file identifier for the root node of the tree-structured index; retrieving, from the content-addressable data store, the root node for the tree-structured index using the unique file identifier for the root node; setting the root node as a current node; performing the following operations, beginning with the root node in the tree-structured index, until retrieving a leaf node in the tree-structured index: obtaining, from the N hash characters of the file path hash, a next hash character of the file path hash, using the obtained next hash character of the file path hash as an offset into the current node to obtain a unique file identifier of a subsequent node at a subsequent level of the tree-structured index, retrieving, from the content-addressable data store, the subsequent node using the unique file identifier, and setting the subsequent node as the current node; identifying, in the leaf node, an entry corresponding to the file path; obtaining, from the entry, a unique file identifier for the particular file in the content-addressable data store; and providing the unique file identifier for the particular file in response to the request.