2015-04-02 21:13:27 +00:00
|
|
|
# Git Large File Storage
|
2013-09-22 22:00:52 +00:00
|
|
|
|
2015-04-02 21:13:27 +00:00
|
|
|
Git LFS is a command line extension and [specification](docs/spec.md) for
|
|
|
|
managing large files with Git. The client is written in Go, with pre-compiled
|
|
|
|
binaries available for Mac, Windows, Linux, and FreeBSD.
|
2015-02-07 16:51:55 +00:00
|
|
|
|
2015-03-24 16:27:18 +00:00
|
|
|
## Features
|
2015-02-07 16:51:55 +00:00
|
|
|
|
2015-04-08 14:22:00 +00:00
|
|
|
By design, every git repository contains every version of every file. But
|
|
|
|
for some types of projects, this is not reasonable or even practical.
|
|
|
|
Multiple revisions of a large file take up space quickly, slowing down
|
|
|
|
repository operations and making fetches unwieldy.
|
|
|
|
|
|
|
|
Git LFS overcomes this limitation by storing the metadata for large files in
|
|
|
|
Git and syncing the file contents to a configurable [Git LFS
|
|
|
|
server](docs/api.md). Some of the key features include:
|
2015-03-24 16:27:18 +00:00
|
|
|
|
2015-04-02 21:13:27 +00:00
|
|
|
* Tight integration with Git means you don't have to change your workflow after
|
|
|
|
the initial configuration.
|
2015-03-24 16:27:18 +00:00
|
|
|
|
2015-04-02 21:13:27 +00:00
|
|
|
* Large files are synced separately to a configurable Git LFS server over HTTPS,
|
|
|
|
so you are not limited in where you push your Git repository.
|
2015-03-24 16:27:18 +00:00
|
|
|
|
2015-04-02 21:13:27 +00:00
|
|
|
* Large files are only synced from the server when they are checked out, so your
|
|
|
|
local repository doesn't carry the weight of every version of every file when it
|
|
|
|
is not needed.
|
2015-03-24 16:27:18 +00:00
|
|
|
|
2015-04-02 21:15:10 +00:00
|
|
|
* The meta data stored in Git is extensible for future use. It currently
|
2015-04-02 21:13:27 +00:00
|
|
|
includes a hash of the contents of the file, and the file size so clients can
|
|
|
|
display a progress bar while downloading or opt out of a large download.
|
2015-03-24 16:27:18 +00:00
|
|
|
|
2015-04-02 21:13:27 +00:00
|
|
|
* Clients and servers can make use of all the features of HTTPS, such as caching
|
|
|
|
content locally on a CDN, resumable uploads and downloads, or performing
|
|
|
|
requests in parallel for faster transfers.
|
2015-02-07 16:51:55 +00:00
|
|
|
|
2015-04-08 16:10:26 +00:00
|
|
|
## Known Implementations
|
|
|
|
|
2015-04-08 16:21:20 +00:00
|
|
|
- [GitHub.com](https://github.com/early_access/large_file_storage) (support coming soon!)
|
2015-04-08 16:10:50 +00:00
|
|
|
- [github/lfs-test-server](https://github.com/github/lfs-test-server) (reference server implementation)
|
2015-04-08 16:10:26 +00:00
|
|
|
|
2015-02-07 16:51:55 +00:00
|
|
|
## Getting Started
|
|
|
|
|
|
|
|
Download the [latest client][rel] and run the included install script. The
|
2015-03-19 19:30:55 +00:00
|
|
|
installer should run `git lfs init` for you, which sets up Git's global
|
|
|
|
configuration settings for Git LFS.
|
2015-02-07 16:51:55 +00:00
|
|
|
|
2015-03-19 19:30:55 +00:00
|
|
|
[rel]: https://github.com/github/git-lfs/releases
|
2015-02-07 16:51:55 +00:00
|
|
|
|
|
|
|
### Configuration
|
|
|
|
|
2015-03-19 19:30:55 +00:00
|
|
|
Git LFS uses `.gitattributes` files to configure which are managed by Git LFS.
|
2015-02-07 16:52:50 +00:00
|
|
|
Here is a sample one that saves zips and mp3s:
|
2015-02-07 16:51:55 +00:00
|
|
|
|
|
|
|
$ cat .gitattributes
|
2015-03-19 19:30:55 +00:00
|
|
|
*.mp3 filter=lfs -crlf
|
|
|
|
*.zip filter=lfs -crlf
|
2015-02-07 16:51:55 +00:00
|
|
|
|
2015-04-02 21:13:27 +00:00
|
|
|
Git LFS can manage `.gitattributes` for you:
|
2015-02-07 16:51:55 +00:00
|
|
|
|
2015-04-02 21:13:27 +00:00
|
|
|
$ git lfs track "*.mp3"
|
|
|
|
Tracking *.mp3
|
2015-02-07 16:51:55 +00:00
|
|
|
|
2015-04-02 21:13:27 +00:00
|
|
|
$ git lfs track "*.zip"
|
|
|
|
Tracking *.zip
|
2015-02-07 16:51:55 +00:00
|
|
|
|
2015-04-02 21:13:27 +00:00
|
|
|
$ git lfs track
|
|
|
|
Listing tracked paths
|
2015-02-07 16:51:55 +00:00
|
|
|
*.mp3 (.gitattributes)
|
|
|
|
*.zip (.gitattributes)
|
|
|
|
|
2015-04-02 21:13:27 +00:00
|
|
|
$ git lfs untrack "*.zip"
|
|
|
|
Untracking *.zip
|
2015-02-07 16:51:55 +00:00
|
|
|
|
2015-04-02 21:13:27 +00:00
|
|
|
$ git lfs track
|
|
|
|
Listing tracked paths
|
2015-02-07 16:51:55 +00:00
|
|
|
*.mp3 (.gitattributes)
|
|
|
|
|
|
|
|
### Pushing commits
|
|
|
|
|
2015-04-08 17:31:08 +00:00
|
|
|
Once setup, you're ready to push some commits:
|
2015-02-07 16:51:55 +00:00
|
|
|
|
|
|
|
$ git add my.zip
|
|
|
|
$ git commit -m "add zip"
|
|
|
|
|
2015-03-19 19:30:55 +00:00
|
|
|
You can confirm that Git LFS is managing your zip file:
|
2015-02-07 16:51:55 +00:00
|
|
|
|
2015-03-19 19:30:55 +00:00
|
|
|
$ git lfs ls-files
|
2015-02-07 16:51:55 +00:00
|
|
|
my.zip
|
|
|
|
|
2015-04-08 17:31:08 +00:00
|
|
|
Once you've made your commits, push your files to the Git remote:
|
2015-02-07 16:51:55 +00:00
|
|
|
|
|
|
|
$ git push origin master
|
|
|
|
Sending my.zip
|
|
|
|
12.58 MB / 12.58 MB 100.00 %
|
|
|
|
Counting objects: 2, done.
|
|
|
|
Delta compression using up to 8 threads.
|
|
|
|
Compressing objects: 100% (5/5), done.
|
|
|
|
Writing objects: 100% (5/5), 548 bytes | 0 bytes/s, done.
|
|
|
|
Total 5 (delta 1), reused 0 (delta 0)
|
2015-03-19 19:30:55 +00:00
|
|
|
To https://github.com/github/git-lfs-test
|
2015-02-07 16:51:55 +00:00
|
|
|
67fcf6a..47b2002 master -> master
|
2013-09-22 22:00:52 +00:00
|
|
|
|
2015-04-02 21:13:27 +00:00
|
|
|
See the [Git LFS overview](https://github.com/github/git-lfs/tree/master/docs)
|
|
|
|
and [man pages](https://github.com/github/git-lfs/tree/master/docs/man).
|
2015-03-24 16:27:18 +00:00
|
|
|
|
|
|
|
## Contributing
|
|
|
|
|
|
|
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for info on working on Git LFS and
|
|
|
|
sending patches.
|