Получить один файл из хранилища - PullRequest
196 голосов
/ 14 июля 2009

Какой самый эффективный механизм (в отношении передаваемых данных и используемого дискового пространства) для получения содержимого одного файла из удаленного хранилища git?

Пока мне удалось придумать:

git clone --no-checkout --depth 1 git@github.com:foo/bar.git && cd bar && git show HEAD:path/to/file.txt

Это все еще кажется излишним.

А как насчет получения нескольких файлов из репо?

Ответы [ 19 ]

131 голосов
/ 20 августа 2013

в git версии 1.7.9.5, похоже, это работает для экспорта одного файла с удаленного компьютера

git archive --remote=ssh://host/pathto/repo.git HEAD README.md

Это будет содержимое файла README.md.

55 голосов
/ 16 марта 2011

Вслед за Якуб ответ . git archive создает архив tar или zip, поэтому вам нужно передать вывод через tar, чтобы получить содержимое файла:

git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x

Сохранит копию 'filename' из HEAD удаленного репозитория в текущем каталоге.

Часть :path/to/directory является необязательной. Если исключено, извлеченный файл будет сохранен в <current working dir>/path/to/directory/filename

Кроме того, если вы хотите разрешить использование git archive --remote в репозиториях Git, размещенных в git-daemon, вам необходимо включить опцию конфигурации daemon.uploadarch. См https://kernel.org/pub/software/scm/git/docs/git-daemon.html

41 голосов
/ 14 июля 2009

Если развернут веб-интерфейс (например, gitweb, cgit, Gitorious, ginatra), вы можете использовать его для загрузки одного файла («сырой» или «простой» вид).

Если другая сторона включила его , вы можете использовать git archive 's' --remote=<URL> '(и, возможно, ограничить его указанным файлом каталога находится в), например:

$ git archive --remote=git@github.com:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -
25 голосов
/ 06 августа 2015

Не в целом, но если вы используете Github:

Для меня wget, чтобы необработанный URL оказался лучшим и простым способом загрузки одного конкретного файла.

Откройте файл в браузере и нажмите кнопку «Сырье». Теперь обновите ваш браузер, скопируйте URL и сделайте на нем wget или curl.

Пример wget:

wget 'https://github.abc.abc.com/raw/abc/folder1/master/folder2/myfile.py?token=DDDDnkl92Kw8829jhXXoxBaVJIYW-h7zks5Vy9I-wA%3D%3D' -O myfile.py

Пример скручивания:

curl 'https://example.com/raw.txt' > savedFile.txt

11 голосов
/ 11 сентября 2015

Чтобы экспортировать один файл с пульта:

git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x

Это загрузит файл README.md в ваш текущий каталог.

Если вы хотите экспортировать содержимое файла в STDOUT:

git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -xO

Вы можете указать несколько путей в конце команды.

8 голосов
/ 02 января 2012

Это выглядит как решение для меня: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD ~ 4: index.html> local_file

, где 4 означает четыре ревизии, а ~ - тильда, как указано в комментарии.

6 голосов
/ 15 июля 2012

Я использую это

$ 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'
3 голосов
/ 08 декабря 2016

Нюансированный вариант некоторых ответов здесь, который отвечает на вопрос ОП:

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
2 голосов
/ 06 марта 2018

Если ваш репозиторий поддерживает токены (например, GitLab), то сгенерируйте токен для своего пользователя, затем перейдите к файлу, который вы скачаете, и нажмите на вывод RAW, чтобы получить URL. Для загрузки файла используйте:

curl --silent --request GET --header 'PRIVATE-TOKEN: replace_with_your_token' \
'http://git.example.com/foo/bar.sql' --output /tmp/bar.sql
1 голос
/ 19 июля 2016

Ответ Исраэля Дова прост, но не допускает сжатия. Вы можете использовать --format=zip, но вы не можете распаковать его напрямую с помощью команды pipe, как вы можете использовать tar, поэтому вам нужно сохранить ее как временный файл. Вот скрипт:

#!/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

Это работает и с каталогами.

...