## Configure Git Large File Storage

Gitblit provides a filestore that supports the [Git Large File Storage (LFS) API](https://git-lfs.github.com/).

### Server Configuration

Gitblit is configured to work straight away.  However you may want to update the following in `gitblit.properties`:

<table class="table">
<thead>
<tr><th>parameter</th><th>value</th><th>description</th></tr>
</thead>
<tbody>
<tr>
  <th>filestore.storageFolder</th><td>${baseFolder}/lfs</td>
  <td>The path on the server where filestore objects are to be saved.</td>
</tr>
<tr>
  <th>filestore.maxUploadSize</th><td>-1</td>
  <td>The maximum allowable size that can be uploaded to the filestore.  Once a file is uploaded it will be unaffected by later changes in this property. The default of -1 indicates no limits.</td>
</tr>
</tbody>
</table>

	
### Limitations

Gitblit currently provides a server-only implementation of the opensource Git LFS API.

1. Files in the filestore are not currently searchable by Lucene.
2. Mirroring a repository that uses Git LFS will only mirror the pointer files, not the large files.
3. Federation - Only the pointer files, not the large files, are transfered.

Items 2 & 3 are pending [JGit Git LFS client capabilities](https://bugs.eclipse.org/bugs/show_bug.cgi?id=470333).


### How does it work?

1. Files that should be handled by Git LFS are defined in the `.gitattributes` file.
2. Git LFS installs a pre-commit hook when installed `git lfs install`.
3. When a commit is made the pre-commit hook replaces the defined Git LFS files with a pointer file containing metadata about the file so that it can be found later.
4. When a commit is pushed, the changeset is sent to the git repository and the large files are sent to the filestore.   

For further details check out the [Git LFS specification](https://github.com/github/git-lfs/blob/master/docs/spec.md).

### Convert/Migrate existing repository

It is possible to migrate an existing repository containing large files to one that leverages the filestore.  However, commit hash history will be altered.

The following command may be run on a local repository:

    git filter-branch --prune-empty --tree-filter '
    git lfs track "*.docx" "*.pdf" > /dev/null
    git add .gitattributes
    git ls-files | xargs -d "\n" git check-attr filter | grep "filter: lfs" | sed -r "s/(.*): filter: lfs/\1/" | xargs -d "\n" -r bash -c "git rm -f --cached \"\$@\"; git add \"\$@\"" bash \
    ' --tag-name-filter cat -- --all


### Further Considerations

While [other Git LFS implementations are available](https://github.com/github/git-lfs/wiki/Implementations) as there is no current [JGit LFS client capability](https://bugs.eclipse.org/bugs/show_bug.cgi?id=470333), Gitblit will be unable to access them.   