Получить один файл из хранилища
Каков наиболее эффективный механизм (в отношении передаваемых данных и используемого дискового пространства) для получения содержимого одного файла из удаленного хранилища 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), вы можете выполнить «выборочную проверку» следующим образом:
-
git clone --no-checkout --depth=1 --no-tags URL
-
git restore --staged DIR-OR-FILE
-
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
репозиторий.
Для 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. Чтобы иметь возможность продолжить загрузку файла с того места, где вы его оставили, если предыдущее намерение не удалось в середине.