139

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
  • 5,107
  • 1
  • 20
  • 27
ChocoDeveloper
  • 14,160
  • 26
  • 79
  • 117

4 Answers4

276

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
  • 5,107
  • 1
  • 20
  • 27
47

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

user2722591
  • 479
  • 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
  • In 2023, this still works, but the button is now called "Code". From a branch, "Code" opens a drop-down that includes that "Download ZIP" link. For a specific commit, click on that commit, then click on "Browse Files" in the upper right corner, and then "Code" appears and provides a ZIP link pointing to the zip file for the commit. – someone Jul 04 '23 at 15:32
9

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
  • 120,358
  • 21
  • 212
  • 242
4

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
  • 15,216
  • 3
  • 86
  • 85
  • 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 – milahu 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