Получить один файл из хранилища

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

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

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

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

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

24 ответа

В git версии 1.7.9.5 это работает для экспорта одного файла с удаленного

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

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

Исходя из ответа Jakub Narębski. 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

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

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

$ git archive --remote=git@github.com:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -

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

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

Откройте файл в браузере и нажмите кнопку "Raw". Теперь обновите ваш браузер, скопируйте 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

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

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

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

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

git show HEAD ~ 4: index.html> local_file

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

Если другой ответ не помог (например, ограниченный доступ к GitLab), вы можете выполнить «выборочную проверку» следующим образом:

  1. git clone --no-checkout --depth=1 --no-tags URL
  2. git restore --staged DIR-OR-FILE
  3. git checkout DIR-OR-FILE

Хотя это решение на 100% совместимо с git и вы можете проверить каталог, оно не оптимально для диска или сети, как выполнение wget / curl для файла.

Я решил таким образом:

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

Если вы хотите, вы можете заменить "BranchName" на "HEAD"

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

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

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

$ 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'

Мне кажется, что проще всего использовать следующее:

wget https://github.com/name/folder/file.zip?raw=true

Если ваш репозиторий поддерживает токены (например, 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

Это относится к репозиториям git, размещенным на GitHub.

Попробуйте команду «api» приложения командной строки Github, gh, чтобы выполнить аутентифицированный вызов конечной точки Github « получить содержимое репозитория» .

Основная команда:

      $gh api /repos/{owner}/{repo}/contents/<path_to_the_file>

В качестве дополнительного бонуса, когда вы делаете это из каталога, содержащего клон репозитория, из которого вы пытаетесь получить файл, части {owner} и {repo} будут автоматически заполнены.

https://docs.github.com/en/rest/reference/repos#get-repository-content

Ответ будет объектом JSON. Если <path_to_the_file> действительно указывает на файл, JSON будет включать в себя «размер», «имя», несколько полей URL для доступа к файлу, а также поле «контент», которое представляет собой версию файла в кодировке base64. содержание.

Чтобы получить содержимое файла, вы можете свернуть значение «download_url» или просто декодировать поле «content». Вы можете сделать это, набрав команду base64, например:

      $gh api /repos/{owner}/{repo}/contents/<path-to-the-file> --jq '.content' | base64 -d

Для одного файла просто используйте команду wget.

Во-первых, следуйте приведенному ниже рисунку, чтобы нажать "raw", чтобы получить URL, иначе вы загрузите код, встроенный в html.

Затем браузер откроет новую страницу с URL-адресом, начинающимся с https://raw.githubusercontent.com/...

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

#wget https://raw.githubusercontent.com/...

Некоторое время файл будет помещен в вашу папку.

У меня сработали следующие 2 команды:

git archive --remote={remote_repo_git_url} {branch} {file_to_download} -o {tar_out_file}

Загрузки file_to_download в виде tar архив из branch удаленного репозитория, URL-адрес которого remote_repo_git_url и хранит его в tar_out_file

tar -x -f {tar_out_file}.tar извлекает file_to_download из tar_out_file

Если ваш Git-репозиторий размещен в Azure-DevOps (VSTS), вы можете получить один файл с помощью Rest API.

Формат этого API выглядит следующим образом:

 https://dev.azure.com/{organization}/_apis/git/repositories/{repositoryId}/items?path={pathToFile}&api-version=4.1?download=true

Например:

 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

Ответ Исраэля Дова прост, но не допускает сжатия. Ты можешь использовать --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

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

Я использую curl, он работает с общедоступными репозиториями или теми, кто использует обычную аутентификацию https через веб-интерфейс.

curl -L --retry 20 --retry-delay 2 -O https://github.com/ACCOUNT/REPO/raw/master/PATH/TO/FILE/FILE.TXT -u USER:PASSWORD

Я протестировал его на GitHub и Bitbucket, работает на обоих.

Корпоративное решение Github

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}"

Если вы не возражаете против клонирования всего каталога, эта небольшая функция bash/zsh будет иметь конечный результат клонирования одного файла в текущий каталог (путем клонирования репо во временный каталог и последующего удаления его).

Pro: Вы получаете только тот файл, который хотите

Con: Вы все еще должны ждать клонирования всего репо

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
}

Если вы хотите получить файл из определенного хеша + удаленного хранилища, я попробовал git-архив, но он не сработал.

Вы должны будете использовать git clone, и как только репозиторий будет клонирован, вам придется использовать git-архив, чтобы он работал.

Я выкладываю вопрос о том, как сделать это проще в git-архиве из конкретного хэша с удаленного

Если ваша цель - просто загрузить файл, есть удобное приложение под названиемgget:

gget github.com/gohugoio/hugo 'hugo_extended_*_Linux-ARM.deb'

В приведенном выше примере будет загружен один файл из hugo репозиторий.

https://github.com/dpb587/gget

Для bitbucket непосредственно из браузера (я использовал safari...), щелкните правой кнопкой мыши "View Raw" и выберите "Download Linked File":

В связи с ответом @Steven Penny я также использую wget. Кроме того, чтобы решить, в какой файл отправлять вывод, я использую -O .

Если вы используете gitlabs, другая возможность для URL-адреса:

wget "https://git.labs.your-server/your-repo/raw/master/<path-to-file>" -O <output-file>

Если у вас нет сертификата или вы получаете доступ с доверенного сервера для установки gitlabs, вам нужен --no-check-certificate, как сказал @Kos. Я предпочитаю это, а не изменять.wgetrc, но это зависит от ваших потребностей.

Если это большой файл, вы можете использовать опцию -c с wget. Чтобы иметь возможность продолжить загрузку файла с того места, где вы его оставили, если предыдущее намерение не удалось в середине.

Другие вопросы по тегам