Configure your GitLab server for Git LFS
Enable Git LFS for a project
Install the Git LFS client locally
Known limitations
How LFS objects affect repository size
Using Git LFS
File Locking
LFS objects in project archives
Related topics
Troubleshooting
Git Large File Storage (LFS)
Managing large files such as audio, video and graphics files has always been one
of the shortcomings of Git. The general recommendation is to not have Git repositories
larger than 1 GB to preserve performance.
Your Git LFS client communicates with the GitLab server over HTTPS. It uses HTTP Basic authentication
to authorize client requests. After the request is authorized, Git LFS client receives
instructions on where to fetch or where to push the large file.
In the repository view, files tracked by Git LFS display an
LFS
badge next to the filename:
To install Git LFS on your self-managed GitLab server, see
GitLab Git Large File Storage (LFS) Administration
.
Enable Git LFS for a project
Prerequisites:
To do this:
-
On the left sidebar, select
Search or go to
and find your project.
-
Select
Settings > General
.
-
Expand the
Visibility, project features, permissions
section.
-
Turn on the
Git Large File Storage (LFS)
toggle.
-
Select
Save changes
.
Install the
Git LFS client
appropriate for
your operating system. GitLab requires version 1.0.1 or later of the Git LFS client.
Git LFS always assumes HTTPS so if you have GitLab server on HTTP you must
add the URL to Git configuration manually
.
Group wikis
do not support Git LFS.
How LFS objects affect repository size
When you add an LFS object to a repository, GitLab:
-
Creates an LFS object.
-
Associates the LFS object with the repository.
-
Queues a job to recalculate your project’s statistics, including storage size and
LFS object storage. Your LFS object storage is the sum of the size of all LFS objects
associated with the repository.
When your repository is forked, LFS objects from the upstream project are associated
with the fork. When the fork is created, the LFS object storage for the fork is equal
to the storage used by the upstream project. If new LFS objects are added to the fork,
the total object storage changes for the fork, but not the upstream project.
If you create a merge request from the fork back to the upstream project,
any new LFS objects in the fork become associated with the upstream project.
Let’s take a look at the workflow for checking large files into your Git
repository with Git LFS. For example, if you want to upload a very large file and
check it into your Git repository:
After you mark a file extension for tracking as a LFS object you can use
Git as usual without redoing the command to track a file with the same extension:
Make sure
that
.gitattributes
is tracked by Git. Otherwise Git
LFS doesn’t work properly for people cloning the project:
Cloning the repository works the same as before. Git automatically detects the
LFS-tracked files and clones them via HTTP. If you performed the
git clone
command with a SSH URL, you have to enter your GitLab credentials for HTTP
authentication.
If you already cloned the repository and you want to get the latest LFS object
that are on the remote repository, such as for a branch from origin:
Make sure your files aren’t listed in
.gitignore
, otherwise, they are ignored by Git
and are not pushed to the remote repository.
Read the documentation on how to
migrate an existing Git repository with Git LFS
.
Removing objects from LFS
To remove objects from LFS:
-
Use
git filter-repo
to remove the objects from the repository.
-
Delete the relevant LFS lines for the objects you have removed from your
.gitattributes
file and commit those changes.
File Locking
See the documentation on
File Locking
.
LFS objects in project archives
Prior to GitLab 13.5,
project source downloads
would include Git
LFS pointers instead of the actual objects. For example, LFS pointers
look like the following:
version https://git-lfs.github.com/spec/v1
oid sha256:3ea5dd307f195f449f0e08234183b82e92c3d5f4cff11c2a6bb014f9e0de12aa
size 177735
In GitLab version 13.5 and later, these pointers are converted to the uploaded
LFS object.
Technical details about how this works can be found in the
development documentation for LFS
.
Blog post:
Getting started with Git LFS
Git LFS developer information
GitLab Git Large File Storage (LFS) Administration
for self-managed instances
Troubleshooting
This error indicates the files are expected to be tracked by LFS, but
the repository is not tracking them as LFS. This issue can be one
potential reason for this error:
Files not tracked with LFS when uploaded through the web interface
To resolve the problem, migrate the affected file (or files) and push back to the repository:
Migrate the file to LFS:
git lfs migrate import --yes --no-rewrite "<your-file>"
Push back to your repository:
git push
Optional. Clean up your .git
folder:
git reflog expire --expire-unreachable=now --all
git gc --prune=now
error: Repository or object not found
This error can occur for a few reasons, including:
Check if you have permissions to push to the project or fetch from the project.
LFS object you are trying to push to the project or fetch from the project is not
available to the project anymore. Probably the object was removed from the server.
Git LFS logs the failures into a log file.
To view this log file, while in project directory:
If the status
error 501
is shown, it is because:
getsockopt: connection refused
If you push an LFS object to a project and receive an error like this,
the LFS client is trying to reach GitLab through HTTPS. However, your GitLab
instance is being served on HTTP:
This behavior is caused by Git LFS using HTTPS connections by default when a
lfsurl
is not set in the Git configuration.
To prevent this from happening, set the LFS URL in project Git configuration: