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


221

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

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

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

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

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


3
Aaw. Я был бы рад, если бы был встроенный способ сделать эквивалент «cat-remote» и «tag-remote».
Конни

3
У меня такая же проблема, я хочу иметь один и тот же файл лицензии в 2 репозиториях; отредактируйте файл в 1 репо, затем сделайте автоматическое обновление копии в другом репо.
GlassGhost

Ответы:


144

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

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

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


27
... За исключением того, что он не работает на GitHub. Dang. :( twitter.com/GitHubHelp/status/322818593748303873
Роб Ховард

13
Похоже, что это не файл raw, а файл tar с одним файлом.
Фрерих Раабе

20
@FrerichRaabe просто добавь `| tar -x` в команду. git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md
Ренье

12
Вы можете использовать tar -xOдля вывода в STDOUT для трубопровода, напримерFILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE"
paulcm

2
Именно ответ, который я искал, но я получаю «фатально: операция не поддерживается протоколом». в ответ от Git. Argh.
mhvelplund

69

Вслед за Якуб «s ответ . 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.


2
Если это текстовый файл, и мы хотим сохранить его в другой части, его стоит использовать: | tar -xO> ~ / destfile.ext
yucer

44

Если есть веб-интерфейс развернут (например, 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 -

Примечание: пример не был проверен!
Якуб Наребски

7
Для ваших собственных репозиториев вам необходимо специально включить upload-archive, если вы используете git-daemon (git: // style urls) с git config daemon.uploadarch trueудаленным репозиторием. По умолчанию git daemon отключает удаленный архив с помощью «fatal: remote error: доступ запрещен или репозиторий не экспортирован: ...»
patthoyts

+1 git archiveПодход был моей первой попыткой - но потом я заметил, что требование tarна клиентском компьютере не совсем удобно для пользователей Windows. Мы закончили получать с нашего локального cgitсервера. Это работает, но не так быстро, как хотелось бы (и все равно требует запуска unix2dosили подобного на машинах Windows, так как мы храним файлы с окончаниями строк Unix в репозитории Git).
Фрерих Раабе

1
@FrerichRaabe Используйте -o fetched.zip. Также см. Параметр --format = <fmt>.
ахан

5
Что бы это ни стоило, похоже, это не работает в репозиториях, размещенных на GitHub. См. Help.github.com/articles/can-i-archive-a-repository и groups.google.com/forum/#!topic/github/z8vLHcX0HxY
vmrob

30

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

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

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


3
Это самое простое решение, и оно работает для любого необработанного текста, который только можно найти. curl https://example.com/raw.txt > savedFile.txt
JacobPariseau

Пример wget не работает, пример curl работает.
Кайл Бейкер

Работает просто отлично для меня. Вы указали свой URL в кавычках в командной строке?
Анкур Агарвал

это не сохраняет историю
мерзавцев

15

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

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

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


9

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

git show HEAD~4:index.html > local_file

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


Обязательно обратите внимание, что это НЕ «знак минус» - «между» ГОЛОВА и «4», а «тильда» ~. По-видимому, я недостаточно хорошо читал git docs, или мои очки нуждаются в обновлении ;-)
Деннис

18
Похоже, что это не получить файл из удаленного хранилища, как это требуется OP.
Майк Веллер

Или: git show HEAD:./my_other_file > local_fileесли файл не в вашей корневой
директории

1
Добрый запрос для всех downvoters - пожалуйста, объясните и уточнить, что не в порядке - мы здесь, чтобы учиться и делиться :)
Марс Робертсон

9
@MichalStefanow: у Майка Уэллера это есть; в частности, это не работает в удаленном хранилище. Вам нужен локальный клон, по крайней мере, даже если на нем установлены удаленные пульты.
Роб Ховард

6

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

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

У меня работает даже без настроек wgetrc:wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash
Adobe

1
Мое сообщение более полезно:ERROR: Certificate verification error for raw.github.com: unable to get local issuer certificate. To connect to raw.github.com insecurely, use '--no-check-certificate'.
Кос

3
Это работает только для публичных репозиториев. Для частных репозиториев вам нужна аутентификация.
Рикардо Отеро

5

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

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

Это не работает, github не поддерживает архив git.
Филипп Фленкер,

2
Err .. git используется не только для GitHub
Виллем ван Кетвич

1
Вы явно указали в своем ответе --remote URL github ;-)
Филипп Фленкер,

1
Спасибо за ответ. Изменили ответ соответственно.
Виллем ван Кетвич

2

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

2

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

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»


2

Мне кажется, самый простой способ использовать следующее:

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

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

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


1

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

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

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

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

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

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


Да, это также хорошо работает в Python или других языках программирования с функциональностью REST. Например, для загрузки модулей из разных репозиториев.
Lars GJ

1

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

Это требует API-токен, не так ли?
Юрий Позняк

Зависит от того, как вы управляете API
Shayki Abramczyk

0

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


0

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

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

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


0

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

введите описание изображения здесь


0

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

Этот ответ может помочь сделать разреженный клон, то есть без накладных расходов.
Юрий Позняк

0

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

Где мы находим GITHUB_PERSONAL_ACCESS_TOKEN?
ShadSterling

1
Вы можете создать личный токен доступа, перейдя по адресу https: // <your-github-server> / settings / tokens и нажав кнопку «Создать новый токен».
Оливер Пирмен

Хм, у нас есть средства автоматизации, которым присваиваются имя пользователя и пароль, которые используются для аутентификации на нескольких системах, использующих один и тот же SSO, поэтому я надеялся найти способ автоматизации создания токена с использованием имени пользователя и пароля.
ShadSterling

0

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

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

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

https://github.com/dpb587/gget


-1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.