-
-H --header
Extra header to use when getting a web page. You may specify any number of extra headers -
-O --remote-name
Write output to a local file named like the remote file we get (only the file part of the remote file is used, the path is cut off) -
-L --location
If the server reports that the requested page has moved to a different location (indicated with a Location: header and a 3XX response code), this option will make curl redo the request on the new place
-
-
Save Integralist/9482061 to your computer and use it in GitHub Desktop.
curl --header 'Authorization: token INSERTACCESSTOKENHERE' \ | |
--header 'Accept: application/vnd.github.v3.raw' \ | |
--remote-name \ | |
--location https://api.github.com/repos/owner/repo/contents/path | |
# Example... | |
TOKEN="INSERTACCESSTOKENHERE" | |
OWNER="BBC-News" | |
REPO="responsive-news" | |
PATH="scripts/build/tabloid.sh" | |
FILE="https://api.github.com/repos/$OWNER/$REPO/contents/$PATH" | |
curl --header 'Authorization: token $TOKEN' \ | |
--header 'Accept: application/vnd.github.v3.raw' \ | |
--remote-name \ | |
--location $FILE |
Great script!
If you download files from private GitHub repos often, you can also check out fetch, an open source, cross-platform tool which makes it easy to download source files and release assets from a git tag, commit, or branch of public and private GitHub repos.
For example, to download the file baz
from version 0.1.3
of a private GitHub repo to /tmp
, you would do the following:
GITHUB_OAUTH_TOKEN="your token"
fetch --repo="https://github.com/foo/bar" --tag="0.1.3" --source-path="/baz" /tmp
does this also work for github enterprise?
fetch doesn't work for the URL with subdomain like "github.example.com"
gruntwork-io/fetch#14
Any idea why I am not able to run this? I am getting below error
$ ./getGithubFile.sh
curl: (77) error setting certificate verify locations:
CAfile: /etc/pki/tls/certs/ca-bundle.crt
CApath: none
./getGithubFile.sh: line 16: curl: command not found
@mdtareque did you override your PATH env variable perhaps?
Hi, @mdtareque:
The PATH="scripts/build/tabloid.sh"
will override system $PATH, maype you can rename it.
Ref rem7's comment about the ref parameter for downloading from a specific branch, I'm struggling to work out how to integrate this into the curl.sh shell script. Can anyone provide an example?
Just add ?ref=branch
to the end of the URL ie:
FILE="https://api.github.com/repos/$OWNER/$REPO/contents/$PATH?ref=a-different-branch
"
I am getting below message when trying to access a private repo.
curl -H 'Authorization: token TOKEN' -H 'Accept: application/vnd.github.v3.raw' -O \ -L https://api.github.com/mkarthik415/repo/blob/master/AppManager/AppManager/maven-metadata-local.xml
curl: Remote file name has no length!
curl: try 'curl --help' or 'curl --manual' for more information
{
"message": "Not Found",
"documentation_url": "https://developer.github.com/v3"
}
Just one comment: rename PATH to another variable name, since PATH is a special variable in Linux Console. You may get "command not found" after setting PATH used in the example.
I would like to download a file from a private repo which I am a member, is it possible I can use the download link to download the file from a browser? I tried it without an error message, but failed to download the file.
BTW, I already logged into my Github account from the browser.
Thanks
+1 to renaming PATH
Is there a way that doesn't utilize the GitHub API?
I usually download a file via raw.githubusercontent.com
but that doesn't seem to be available for private repositories.
Github enforces usage of a valid User-Agent
in the request headers.
If you are making the same request multiple times, include a If-Modified-Since
header and respect the 304 Not Modified
response (using modification time via --time-cond
).
curl --header "Authorization: token $TOKEN" \
--header "Accept: application/vnd.github.v3.raw" \
--header "User-Agent: ${OWNER}/${REPO} (curl v7.47.0)" \
--time-cond "$CACHE" \
--remote-name \
--location "$FILE"
How can I download the entire repository from GitHub any idea, please??
Using fetch ($TOKEN -> TOKEN, $FILE -> FILE):
fetch('https://api.github.com/repos/owner/repo/contents/path', {
headers: {
'Authorization': 'token ' + TOKEN,
'Accept': 'application/vnd.github.v3.raw',
},
})
.then(response => response.buffer())
.then(content => {
console.log('[FILE]', 'Writing ' + FILE);
fs.writeFileSync(FILE, content);
})
.catch(() => {
throw new Error('File unreachable');
});
+1 Rename $PATH
Note that this endpoint is limited to 1 MB files. any larger will fail. working on a workaround
I have found a workaround for large files (up to 100 MB but as far as I know it is not possible to drop larger files to github so this should work with all files)
the contents endpoint used above cannot get the file if larger than 1 MB so trim the $PATH to direct to the folder where your file lies in the initial request using the contents endpoint
In the response, find your file listed, get its SHA,
use the /repos/:username/:reponame/git/blobs/:sha
endpoint to get your content in 64 bit encoded form. Decode it using your favorite decoder.
For reference, see the R code below
getGithubFile = function(githubPath,branch = 'master', downloadPath = NULL,token = NULL){
if(is.null(downloadPath)){
downloadPath = tempfile()
}
path = strsplit(githubPath,'/')[[1]]
file = paste(path[3:length(path)], collapse = '/')
contents = gh::gh('GET /repos/:username/:reponame/contents/:dir?ref=:branch',
username = path[1],
reponame = path[2],
branch = branch,
dir = dirname(file),
.token = token)
names(contents) = contents %>% purrr::map_chr('name')
fileInfo = contents[contents %>% purrr::map_chr('name') %>% {.%in%basename(file)}][[1]]
blob = gh::gh('GET /repos/:username/:reponame/git/blobs/:sha',
username = path[1],
reponame = path[2],
sha = fileInfo$sha,
.token = token)
decodeContent = openssl::base64_decode(blob$content)
writeBin(decodeContent,downloadPath)
return(invisible(downloadPath))
}
Using API V4 with Graphql
query {
repository(name: "repo-name", owner: "owner") {
object(expression: "branch:file/to/path.extension") {
... on Blob {
text
}
}
}
}
@Kif11 - it's possible with basic auth (without the user having to explicitly create a token first).
it can be boiled down to a one-liner (see the original gist for details):
curl -u "$USER" -k https://${GHE_DOMAIN}/raw/${REPO_OWNER}/${REPO_NAME}/${REF}/${FILE} > ${FILE}
I don't know if things changed since May, but neither token nor basic auth works for me. I'm getting
{
"message": "Not Found",
"documentation_url": "https://developer.github.com/v3"
}
curl --header 'Authorization: token INSERTACCESSTOKENHERE'
--header 'Accept: application/vnd.github.v3.raw'
--remote-name
--location https://api.github.com/repos/owner/repo/contents/path
Hey,
it code can work using the is oauth app token any idea please share me?
use the solution in the first part of the article it works without problem
I don't know if things changed since May, but neither token nor basic auth works for me. I'm getting
{ "message": "Not Found", "documentation_url": "https://developer.github.com/v3" }
I thought this was no longer working, however what I did wrong is not adding the correct permissions to the token I was generating.
I marked
"repo
Full control of private repositories "
to get it working. There is maybe a less permissive alternative that still allows you to just read.
Fashionably Late, as always!
Originally, I was having trouble with the Token, itself.
However, after creating a New Token, with Everything Checked, my issues seemed to Clear-up.
From Command Line, the following worked, on my end.
curl -v -H "Authorization: token ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -H "Accept: application/vnd.github.v4.raw" -O -L "https://api.github.com/repos/<UserName>/<RepoName>/contents/<FolderPath>/<FileName>.ps1"
With that being said, I would imagine that something like the following, should do the trick.
curl --header 'Authorization: token ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
--header 'Accept: application/vnd.github.v3.raw'
--location 'https://api.github.com/repos/<UserName>/<RepoName>/contents/<FolderPath>/<FileName>.ps1'
What are the minimum permissions for a Personal Access required to do this (specifically for Enterprise, if there's a difference).
Thx.
Just as a note, the remote-name parameter can append the ref parameter if present. I haven't found a good workaround to this