How to use git to get just the latest revision of a project?

Viewed 180984

I don't want to clone the full repository and I'm not going to be submitting patches. I do want to easily get new revisions in the future.

I have tried using git clone, but this creates a copy of the entire repository (huge file size) and tracking changes makes the disk space even bigger (100mb of files now takes up over 2gb).

Is this possible?

3 Answers

Use git clone with the --depth option set to 1 to create a shallow clone with a history truncated to the latest commit.

For example:

git clone --depth 1 https://github.com/user/repo.git

To also initialize and update any nested submodules, also pass --recurse-submodules and to clone them shallowly, also pass --shallow-submodules.

For example:

git clone --depth 1 --recurse-submodules --shallow-submodules https://github.com/user/repo.git

Alternate solution to doing shallow clone (git clone --depth=1 <URL>) would be, if remote side supports it, to use --remote option of git archive:

$ git archive --format=tar --remote=<repository URL> HEAD | tar xf -

Or, if remote repository in question is browse-able using some web interface like gitweb or GitHub, then there is a chance that it has 'snapshot' feature, and you can download latest version (without versioning information) from web interface.

These days, shallow clones are not recommended in most cases.

While, for the use case you mention (download the latest version and never touch it again), git clone --depth=1 works, in the more general case, it can create problems. For instance, if you want to keep your clone up to date with upstream, git fetch is much more expensive on a shallow clone.

If what you want is to download less data, partial clones are better for the general case:

git clone --filter=tree:0 <url>

This will still download the commit history, but it won't download file trees and file contents for previous commits. Fetches to upstream commits will still be cheap.

Related