Получить один файл из репозитория

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

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

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

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

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


person Community    schedule 14.07.2009    source источник
comment
Aaw. Мне бы очень понравилось, если бы существовал встроенный способ сделать эквивалент cat-remote и tag-remote.   -  person conny    schedule 07.07.2010
comment
У меня такая же проблема. Я хочу иметь один и тот же файл лицензии в двух репозиториях; отредактируйте файл в 1 репо, а затем автоматически обновите копию в другом репо.   -  person GlassGhost    schedule 26.01.2011


Ответы (23)


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

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

Это перехватит содержимое файла README.md.

person Yisrael Dov    schedule 20.08.2013
comment
... За исключением того, что это не работает на GitHub. Черт возьми. :( twitter.com/GitHubHelp/status/322818593748303873 - person Rob Howard; 26.09.2013
comment
Похоже, это дает не необработанный файл, а скорее tar-файл с одним файлом. - person Frerich Raabe; 10.03.2014
comment
@FrerichRaabe просто добавьте `| tar -x` к команде. git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x cat README.md - person renier; 21.05.2015
comment
Вы можете использовать tar -xO для вывода в STDOUT для трубопровода, например. FILE=README.md && git archive --remote=ssh://host/pathto/repo.git HEAD "$FILE" | tar -xO "$FILE" - person paulcm; 25.08.2015
comment
Это именно тот ответ, который я искал, но получил фатальный результат: операция не поддерживается протоколом. в ответ от Git. Ага. - person mhvelplund; 18.02.2016
comment
Это, по-видимому, работает, но у меня проблема: сумма md5 того, что я получаю после распаковки, не совпадает с тем, что у меня есть в репозитории git, это то, что я получаю обратно: md5sum README.md f8359c59f8ebc61adfcef6c19aea0a97 README.md это то, что в репозитории git: md5sum README.md 2ff7094d2cb8d574b4ca04a95ceff534 README.md - person louigi600; 19.08.2016
comment
Экспортирует заголовок и трейлер с большим количеством нулей. - person fcm; 23.10.2017
comment
Этот ответ является хорошим началом, но проблема, которую он не проясняет, заключается в том, что объединенное содержимое README.md будет включать в себя кучу мусора из заголовков, поскольку на самом деле это tar-файл, а не просто текст. В конце концов, мне пришлось использовать git archive --remote ${remoteGitRepo} HEAD ${sourceFilePath} | tar --extract --directory ${tempDir}, а затем прочитать файл в ${tempDir}/${sourceFilePath}, чтобы получить чистую версию текста исходного файла, что в значительной степени совпадает с тем, что делало исходное решение OP. - person Aaron Beall; 27.10.2017
comment
Я получаю сообщение об ошибке: фатальный: операция не поддерживается протоколом., когда я пытаюсь использовать ее в репозитории, размещенном на GitHub. Если этот метод не работает с протоколом, используемым GitHub, его можно смело считать ненадежным. - person Sophia_ES; 19.11.2017
comment
можно ли указать ветку? - person arod; 13.05.2018
comment
@RobHoward Для GitHub см. stackoverflow.com / questions / 9609835 / - person Wolfgang; 22.10.2018
comment
@arod Да, просто укажите имя ветки вместо HEAD. - person Wolfgang; 22.10.2018
comment
Это не работает для хэша коммитов sha. Из docs: ни относительная фиксация, как master, ни буквальный sha1, например abcd1234 разрешено - person tar; 09.06.2020

Следуя за Jakub / 1126333/2378780 "> ответ. git archive создает архив tar или zip, поэтому вам нужно направить вывод через tar, чтобы получить содержимое файла:

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

Сохранит копию имени файла из 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

person Robert Knight    schedule 16.03.2011
comment
Если это текстовый файл, и мы хотим сохранить его в другой части, его нужно использовать: | tar -xO ›~ / destfile.ext - person yucer; 15.07.2015

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

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

$ git archive [email protected]:foo/bar.git --prefix=path/to/ HEAD:path/to/ |  tar xvf -
person Jakub Narębski    schedule 14.07.2009
comment
Примечание: пример не тестировался! - person Jakub Narębski; 14.07.2009
comment
Для ваших собственных репозиториев вам нужно специально включить загрузку-архив, если вы используете git-daemon (git: // style urls) с git config daemon.uploadarch true в удаленном репозитории. По умолчанию демон git отключает удаленный архив с фатальной: удаленная ошибка: доступ запрещен или репозиторий не экспортирован: ... - person patthoyts; 07.02.2013
comment
+1 Подход git archive был моей первой попыткой, но потом я заметил, что требовать tar на клиентской машине не совсем удобно для пользователей Windows. Мы закончили загрузку с нашего локального cgit сервера. Он работает, но не так быстро, как хотелось бы (и для этого по-прежнему требуется запуск unix2dos или аналогичный на машинах с Windows, поскольку мы храним файлы с окончаниями строк Unix в репозитории Git). - person Frerich Raabe; 10.03.2014
comment
Есть ли графический интерфейс, который может просматривать удаленный git и где вы можете автоматически активировать эту команду git archive... в фоновом режиме, чтобы видеть отдельные файлы непосредственно внутри графического интерфейса? - person rubo77; 21.03.2014
comment
@FrerichRaabe Используйте -o fetched.zip. Также см. Параметр --format = ‹fmt›. - person akhan; 06.05.2014
comment
Как бы то ни было, похоже, что это не работает в репозиториях, размещенных на GitHub. См. help.github.com/articles/can-i-archive-a -repository и groups.google.com/forum/#!topic / github / z8vLHcX0HxY - person vmrob; 21.08.2014
comment
Добавьте |tar -xO, чтобы записать файл в стандартный вывод. - person neuhaus; 19.01.2018

Не в общем, но если вы используете 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
person Ankur Agarwal    schedule 05.08.2015
comment
Это самое простое решение, которое работает с любым необработанным текстовым файлом, который можно найти. curl https://example.com/raw.txt > savedFile.txt - person JacobPariseau; 06.01.2017
comment
Пример wget не работает, хотя пример curl работает. - person Kyle Baker; 10.02.2017
comment
У меня отлично работает. Вы поместили свой URL в кавычки в командной строке? - person Ankur Agarwal; 11.02.2017
comment
это не сохраняет историю git - person crypdick; 30.06.2018
comment
Решение запрашивается для Git, ответ подтверждает, что Github - это git и нигде не связан с git. Он основан на дополнительных API, предлагаемых известным поставщиком решений для git! - person Ravinder Payal; 22.03.2021
comment
Если вам нужно необработанное содержимое файла из github, просто запустите curl с этим URL-адресом, например: curl 'https://raw.githubusercontent.com/SoliDry/api-generator/master/tests/functional/oas/openapi.yaml' > openapi_test.yaml Он легко доступен из пользовательского интерфейса btn raw btw. - person Arthur Kushman; 14.05.2021

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

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

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

person Kousha    schedule 10.09.2015

Мне это кажется решением: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

git show HEAD~4:index.html > local_file

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

person Mars Robertson    schedule 02.01.2012
comment
Обязательно обратите внимание на то, что это НЕ «знак минус» - »между« HEAD »и« 4 », а« тильда »« ~ ». По-видимому, я недостаточно хорошо прочитал git docs, или мои очки нуждаются в обновлении ;-) - person Dennis; 04.07.2012
comment
Однако это не похоже на получение файла из удаленного репозитория, как в случае с OP. - person Mike Weller; 18.01.2013
comment
Или: git show HEAD:./my_other_file > local_file, если файла нет в вашем корневом каталоге :) - person kenorb; 21.06.2013
comment
Или: git show refs/remotes/my_remote/master:./my_file где refs path - ваш правильный удаленный путь, полученный: git show-ref - person kenorb; 21.06.2013
comment
Убедительная просьба ко всем отрицательным голосам - пожалуйста, объясните и поясните, что не в порядке - мы здесь, чтобы узнать и поделиться :) - person Mars Robertson; 26.07.2013
comment
@MichalStefanow: он есть у Майка Веллера; в частности, это не работает с удаленным репозиторием. Вам нужен как минимум локальный клон, даже если на нем настроены пульты дистанционного управления. - person Rob Howard; 26.09.2013

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

$ 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'
person Steven Penny    schedule 14.07.2012
comment
У меня работает даже без настроек wgetrc: wget https://raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash - person Adobe; 03.09.2012
comment
Мое сообщение более полезно: 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'. - person Kos; 18.01.2013
comment
Это работает только для публичных репозиториев. Для частных репозиториев вам нужна аутентификация. - person Ricardo Otero; 05.01.2015

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

git archive [email protected]:foo/bar.git \
  HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt
person Willem van Ketwich    schedule 08.12.2016
comment
Это не работает, github не поддерживает архив git. - person Philipp; 12.09.2018
comment
Эээ .. git используется не только для GitHub - person Willem van Ketwich; 14.09.2018
comment
Вы явно указали --remote на URL-адрес github в своем ответе ;-) - person Philipp; 14.09.2018
comment
Спасибо за ответ. Соответственно изменили ответ. - person Willem van Ketwich; 14.09.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
person panticz    schedule 06.03.2018

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

wget https://github.com/name/folder/file.zip?raw=true
person ihsinme    schedule 22.04.2020

Я решил так:

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.

person matiasmasca    schedule 22.09.2018

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

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

person naught101    schedule 19.07.2016

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

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

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

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

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

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

person malajisi    schedule 16.06.2017
comment
Да, это также хорошо работает в Python или других языках программирования с REST-функциями. Например для загрузки модулей из разных репозиториев .. - person Lars GJ; 10.10.2018

Если ваш репозиторий 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
person Shayki Abramczyk    schedule 16.09.2018
comment
Для этого нужен токен api, не так ли? - person Yuriy Pozniak; 07.11.2019
comment
Зависит от того, как вы запускаете api - person Shayki Abramczyk; 07.11.2019

Решение Github Enterprise

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}"
person Oliver Pearmain    schedule 04.06.2019
comment
Где мы находим GITHUB_PERSONAL_ACCESS_TOKEN? - person ShadSterling; 23.03.2020
comment
Вы можете создать личный токен доступа, перейдя по адресу https: // ‹your-github-server› / settings / tokens и нажав кнопку «Создать новый токен». - person Oliver Pearmain; 24.03.2020
comment
Хм, у нас есть автоматизация, которой присваиваются имя пользователя и пароль, которые используются для аутентификации в нескольких системах, использующих один и тот же единый вход, поэтому я надеялся найти способ автоматизировать создание токена с учетом имени пользователя и пароля. - person ShadSterling; 25.03.2020

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

person JasonS    schedule 04.06.2015

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

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

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

person Fernanda Martins    schedule 14.12.2016

для битбакета прямо из браузера (я использовал safari ...), щелкните правой кнопкой мыши «Просмотр сырых данных» и выберите «Загрузить связанный файл»:

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

person ingconti    schedule 30.08.2018

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

Pro: вы получаете только тот файл, который вам нужен

Против: вам все равно придется ждать, пока все репо будет клонировано

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
}
person Christopher Shroba    schedule 28.10.2018
comment
Этот ответ может помочь создать разреженный клон, то есть без накладных расходов. - person Yuriy Pozniak; 07.11.2019

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

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

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

https://github.com/dpb587/gget

person Granitosaurus    schedule 09.06.2020

У меня работали следующие 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

person rok    schedule 10.11.2020

Если другой ответ не помог (например, ограниченный доступ к 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 для файла.

person ATorras    schedule 05.05.2021

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

person Hector Llorens    schedule 19.06.2014