Извлечение одного файла из репозитория

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

До сих пор мне удалось найти:

git clone --no-checkout --depth 1 [email protected]:foo/bar.git && cd bar && git show HEAD:path/to/file.txt

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

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

Ответ 1

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

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

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

Ответ 2

Исходя из ответа Якуба. 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.

Ответ 3

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

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

$ git archive [email protected]:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -

Ответ 4

Не в общем, но если вы используете 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

Ответ 5

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

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

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

Ответ 7

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

$ 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

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

git archive [email protected]:foo/bar.git \
  HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt

Ответ 9

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

Ответ 10

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

#!/bin/bash

BASENAME=$0

function usage {
    echo "usage: $BASENAME <remote-repo> <file> ..."
    exit 1
}

[ 2 -gt "$#" ] && { usage; }

REPO=$1
shift
[email protected]

TMPFILE=`mktemp`.zip
git archive -9 --remote=$REPO HEAD $FILES -o $TMPFILE
unzip $TMPFILE
rm $TMPFILE

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

Ответ 11

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

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

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

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

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

A, пока файл будет помещен в вашу папку.

Ответ 12

Если ваш репозиторий 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

Ответ 13

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

git archive --remote=ssh://[email protected]/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"

Ответ 14

Я использую 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, работает на обоих.

Ответ 15

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

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

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

Ответ 16

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

enter image description here

Ответ 17

Если вы не возражаете против клонирования всего каталога, эта небольшая функция 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
}

Ответ 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

Относительно ответа @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. Чтобы продолжить загрузку файла с того места, где вы его оставили, если предыдущее намерение не удалось посередине.