127

I want to download a .zip with the source of a library hosted on github, but I don't want the master, because every time I download I could be downloading a different version.

This particular library does not have tags, so I can't use that.

So how do I download the source.zip for a specific commit sha?

Zeki
  • 4,877
  • 1
  • 18
  • 27
ChocoDeveloper
  • 13,544
  • 23
  • 76
  • 115

4 Answers4

258

You can put the sha that you want in the download url:

https://github.com/{username}/{projectname}/archive/{sha}.zip

As a general rule, if you have a url that works, you can replace "master" with the specific sha you want.

On unix:

wget https://github.com/{username}/{projectname}/archive/{sha}.zip

Keep in mind that if this is a private repo then wget will not work unless you pass an OAuth token as well.

Here's more info on that:

Having trouble downloading Git archive tarballs from Private Repo

Zeki
  • 4,877
  • 1
  • 18
  • 27
44

When viewing the commit's code, click the button "Browse Code" on the upper right, after that click on "Download ZIP".

user2722591
  • 449
  • 4
  • 2
  • 1
    They have a 'Clone or Download' button now, where you can 'Download ZIP'. – SureshS Jul 27 '16 at 04:24
  • "Clone or Download" is the new button that replaces the old "Clone" and "Download" buttons. The new-button doesn't do specific versions - use the way Zeki described – pal Sep 03 '16 at 14:28
  • 3
    This worked for me in Feb 2017. It did download the repo with changes at the timestamp of the selected commit. – ocean4dream Feb 17 '17 at 03:05
8

This is a an old question, but wanted to mention that if you want just the commit as a patch, and not the whole repo at the time of the commit, you can use:

$ wget http://github.com/username/repo/commit/sha1.patch
#                        ^^^^^^^^ ^^^^        ^^^^
#                        change   change      change

The /commit and .patch parts being the important part.

This is particularly useful if you want to merge in a change that was reversed a while back and therefore doesn't exist in the forked repo.

trojanfoe
  • 118,129
  • 19
  • 204
  • 237
2

For those who came here looking for a way to download a particular file (or directory), from a particular commit (or branch):

git_user="user-name"
git_project="project-name"
commit_or_branch="sha-id or branch name"
dir_or_file="path/to/dir-or-file"

archive_url="https://github.com/${git_user}/${git_project}/archive/${commit_or_branch}.tar.gz"

wget -O - ${archive_url} | tar xz --strip=1 "${git_project}-${commit_or_branch}/${dir_or_file}"

The advantage of downloading the archive as tar.gz, is that you can directly pipe wget into tar command, so it will extract the gz on the fly.

Noam Manos
  • 12,732
  • 2
  • 76
  • 75
  • 1
    wasteful. files can be downloaded directly, subdirectories can be downloaded via github's SVN interface, see https://stackoverflow.com/questions/7106012/download-a-single-folder-or-directory-from-a-github-repo – Mila Nautikus Nov 17 '20 at 06:59
  • 2
    @MilaNautikus your link for using `svn` - **requires SVN** to be installed first, while `wget` is already available on most platforms. Instead of downvoting, post a useful answer. – Noam Manos Nov 17 '20 at 07:37