问题
What is the most efficient mechanism (in respect to data transferred and disk space used) to get the contents of a single file from a remote git repository?
So far I\'ve managed to come up with:
git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt
This still seems overkill.
What about getting multiple files from the repo?
回答1:
in git version 1.7.9.5 this seems to work to export a single file from a remote
git archive --remote=ssh://host/pathto/repo.git HEAD README.md
This will cat the contents of the file README.md
.
回答2:
Following on from Jakub's answer. git archive
produces a tar or zip archive, so you need to pipe the output through tar to get the file content:
git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x
Will save a copy of 'filename' from the HEAD of the remote repository in the current directory.
The :path/to/directory
part is optional. If excluded, the fetched file will be saved to <current working dir>/path/to/directory/filename
In addition, if you want to enable use of git archive --remote
on Git repositories hosted by git-daemon, you need to enable the daemon.uploadarch config option. See https://kernel.org/pub/software/scm/git/docs/git-daemon.html
回答3:
If there is web interface deployed (like gitweb, cgit, Gitorious, ginatra), you can use it to download single file ('raw' or 'plain' view).
If other side enabled it, you can use git archive's '--remote=<URL>
' option (and possibly limit it to a directory given file resides in), for example:
$ git archive --remote=git@github.com:foo/bar.git --prefix=path/to/ HEAD:path/to/ | tar xvf -
回答4:
Not in general but if you are using Github:
For me wget
to the raw url turned out to be the best and easiest way to download one particular file.
Open the file in the browser and click on "Raw" button. Now refresh your browser, copy the url and do a wget
or curl
on it.
wget example:
wget 'https://github.abc.abc.com/raw/abc/folder1/master/folder2/myfile.py?token=DDDDnkl92Kw8829jhXXoxBaVJIYW-h7zks5Vy9I-wA%3D%3D' -O myfile.py
Curl example:
curl 'https://example.com/raw.txt' > savedFile.txt
回答5:
To export a single file from a remote:
git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x
This will download the file README.md
to your current directory.
If you want the contents of the file exported to STDOUT:
git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -xO
You can provide multiple paths at the end of the command.
回答6:
It looks like a solution to me: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html
git show HEAD~4:index.html > local_file
where 4
means four revision from now and ~
is a tilde as mentioned in the comment.
回答7:
I use this
$ cat ~/.wgetrc
check_certificate = off
$ wget https://raw.github.com/jquery/jquery/master/grunt.js
HTTP request sent, awaiting response... 200 OK
Length: 11339 (11K) [text/plain]
Saving to: `grunt.js'
回答8:
A nuanced variant of some of the answers here that answers the OP's question:
git archive --remote=git@archive-accepting-git-server.com:foo/bar.git \
HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt
回答9:
If you repository supports tokens (for example GitLab) then generate a token for your user then navigate to the file you will download and click on RAW output to get the URL. To download the file use:
curl --silent --request GET --header 'PRIVATE-TOKEN: replace_with_your_token' \
'http://git.example.com/foo/bar.sql' --output /tmp/bar.sql
回答10:
I solved in this way:
git archive --remote=ssh://git@gitlab.com/user/mi-repo.git BranchName /path-to-file/file_name | tar -xO /path-to-file/file_name > /path-to-save-the-file/file_name
If you want, you could replace "BranchName" for "HEAD"
回答11:
Yisrael Dov's answer is the straightforward one, but it doesn't allow compression. You can use --format=zip
, but you can't directly unzip that with a pipe command like you can with tar, so you need to save it as a temporary file. Here's a script:
#!/bin/bash
BASENAME=$0
function usage {
echo "usage: $BASENAME <remote-repo> <file> ..."
exit 1
}
[ 2 -gt "$#" ] && { usage; }
REPO=$1
shift
FILES=$@
TMPFILE=`mktemp`.zip
git archive -9 --remote=$REPO HEAD $FILES -o $TMPFILE
unzip $TMPFILE
rm $TMPFILE
This works with directories too.
回答12:
For single file, just use wget command.
First, follow the pic below to click "raw" to get the url, otherwise you will download code embedded in html.
Then, the browser will open a new page with url start with https://raw.githubusercontent.com/...
just enter the command in the terminal:
#wget https://raw.githubusercontent.com/...
A while the file will put in your folder.
回答13:
If your Git repository hosted on Azure-DevOps (VSTS) you can retrieve a single file with Rest API.
The format of this API looks like this:
https://dev.azure.com/{organization}/_apis/git/repositories/{repositoryId}/items?path={pathToFile}&api-version=4.1?download=true
For example:
https://dev.azure.com/{organization}/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items?scopePath=/MyWebSite/MyWebSite/Views/Home/_Home.cshtml&download=true&api-version=4.1
回答14:
I use curl, it works with public repos or those using https basic authentication via a web interface.
curl -L --retry 20 --retry-delay 2 -O https://github.com/ACCOUNT/REPO/raw/master/PATH/TO/FILE/FILE.TXT -u USER:PASSWORD
I've tested it on github and bitbucket, works on both.
回答15:
If you want to get a file from a specific hash + a remote repository I've tried git-archive and it didn't work.
You would have to use git clone and once the repository is cloned you would have then to use git-archive to make it work.
I post a question about how to do it more simpler in git archive from a specific hash from remote
回答16:
for bitbucket directly from browser (I used safari...) right-click on 'View Raw" and choose "Download Linked File":
回答17:
If you don't mind cloning the entire directory, this small bash/zsh function will have the end result of cloning a single file into your current directory (by cloning the repo into a temp directory and removing it afterwards).
Pro: You only get the file you want
Con: You still have to wait for the whole repo to clone
git-single-file () {
if [ $# -lt 2 ]
then
echo "Usage: $0 <repo url> <file path>"
return
fi
TEMP_DIR=$(mktemp -d)
git clone $1 $TEMP_DIR
cp $TEMP_DIR/$2 .
rm -rf $TEMP_DIR
}
回答18:
Github Enterprise Solution
HTTPS_DOMAIN=https://git.your-company.com
ORGANISATION=org
REPO_NAME=my-amazing-library
FILE_PATH=path/to/some/file
BRANCH=develop
GITHUB_PERSONAL_ACCESS_TOKEN=<your-access-token>
URL="${HTTPS_DOMAIN}/raw/${ORGANISATION}/${REPO_NAME}/${BRANCH}/${FILE_PATH}"
curl -H "Authorization: token ${GITHUB_PERSONAL_ACCESS_TOKEN}" ${URL} > "${FILE_PATH}"
回答19:
Related to @Steven Penny's answer, I also use wget. Furthermore, to decide which file to send the output to I use -O .
If you are using gitlabs another possibility for the url is:
wget "https://git.labs.your-server/your-repo/raw/master/<path-to-file>" -O <output-file>
Unless you have the certificate or you access from a trusted server for the gitlabs installation you need --no-check-certificate as @Kos said. I prefer that rather than modifying .wgetrc but it depends on your needs.
If it is a big file you might consider using -c option with wget. To be able to continue downloading the file from where you left it if the previous intent failed in the middle.
来源:https://stackoverflow.com/questions/1125476/retrieve-a-single-file-from-a-repository