Загрузите одну папку или каталог из репозитория GitHub

Как загрузить только конкретную папку или каталог из удаленного репозитория Git, размещенного на GitHub?

Скажем, пример GitHub repo живет здесь:

[email protected]:foobar/Test.git

Структура его каталогов:

Test/
    foo/ 
       a.py
       b.py
    bar/
       c.py
       d.py

Я хочу загрузить только папку foo и не клонировать весь тестовый проект.

Ответ 1

Обновление, сентябрь 2016 г. Сообщество разработало несколько инструментов, которые могут сделать это за вас:


Git не поддерживает это, но Github делает это через SVN. Если вы извлекаете свой код с помощью Subversion, Github по существу преобразует репозиторий из Git в Subversion в серверной части, а затем обслуживает запрошенный каталог.

Вот как вы можете использовать эту функцию для загрузки определенной папки. В качестве примера я буду использовать популярную библиотеку JavaScript lodash.

  1. Перейдите в папку, которую вы хотите загрузить. Пусть скачивают /test из ветки master. github repo URL example

  2. Измените URL для Subversion. Замените tree/master на trunk.

    https://github.com/lodash/lodash/tree/master/test

    https://github.com/lodash/lodash/trunk/test

  3. Загрузите папку. Перейдите в командную строку и возьмите папку с SVN.

svn checkout https://github.com/lodash/lodash/trunk/test

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

Полное описание формата URL:

  • Если вы заинтересованы в ветке master, используйте вместо нее trunk. Таким образом, полный путь - trunk/foldername
  • Если вы заинтересованы в ветке foo, используйте вместо нее branches/foo. полный путь выглядит как branches/foo/foldername
  • Подсказка: вы можете использовать svn ls, чтобы просмотреть доступные теги и ветки перед загрузкой, если хотите

Это все! Github также поддерживает больше подрывных функций, включая поддержку фиксации и отправки изменений.

Ответ 2

Два варианта этой функции:

Вариант 1. Расширения браузера

Chrome Extension, Firefox Addon

Использование:

  1. На любой странице репозитория GitHub.
  2. Просто дважды щелкните по пустой части нужных вам предметов.
  3. Нажмите кнопку загрузки в правом нижнем углу.
  4. Просмотрите панель прогресса и дождитесь загрузки триггера браузера.
  5. Получите ZIP файл.

Получить токен:

  1. Нажмите значок расширения GitZip в своем браузере.
  2. Нажмите ссылку "Обычный" или "Личный", кроме "Получить токен".
  3. Авторизуйте разрешение GitZip на странице авторизации Github.
  4. Вернуться на страницу репо начала.
  5. Продолжайте использовать.

Вариант 2: Github gh-page

http://kinolien.github.io/gitzip by using GitHub API, и JSZip, FileSaver.js libraries.

Шаг 1: Введите URL-адрес github в поле в правом верхнем углу.
Шаг 2: Нажмите клавишу ввода или нажмите "Загрузить", чтобы скачать zip напрямую, или нажмите кнопку "Поиск", чтобы просмотреть список подпапок и файлов.
Шаг 3: Нажмите "Скачать файл Zip" или "Получить файл", чтобы получить файлы.

В большинстве случаев это работает нормально, за исключением того, что папка содержит более 1000 файлов из-за ограничения Github Trees API. (относится к Github API # Contents)

Кроме того, он может поддерживать частные/публичные репозитории и обновлять ограничение скорости, если у вас есть учетная запись GitHub и используется ссылка "получить токен" на этом сайте.

Ответ 3

Перейдите к DownGit > Введите свой URL > Загрузить!

Теперь вы можете DIRECTLY DOWNLOAD или создать DOWNLOAD LINK для любого общедоступного каталога или файла GitHub (особенно большого файла) из DownGit! Вот простая демонстрация -


DownGit


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

Ответ 4

Если у вас svn, вы можете использовать svn export для этого:

svn export https://github.com/foobar/Test.git/trunk/foo

Обратите внимание на формат URL:

  • Базовый URL https://github.com/
  • /trunk прилагается в конце

Перед запуском svn export полезно сначала проверить содержимое каталога с помощью

svn ls https://github.com/foobar/Test.git/trunk/foo

Ответ 5

Для Общего git Repo:

Если вы хотите загружать файлы, а не клонировать хранилище с историей, вы можете сделать это с помощью git-archive.

git-archive создает сжатый zip или tar архив из git репозитория. Некоторые вещи, которые делают его особенным:

  1. Вы можете выбрать, какие файлы или каталоги в репозитории git архивировать.
  2. Он не архивирует папку .git/ или любые неотслеживаемые файлы в репозитории, в котором он запущен.
  3. Вы можете заархивировать конкретную ветку, тег или коммит. Проекты, управляемые с помощью git, часто используют это для создания архивов версий проекта (бета, выпуск, 2.0 и т.д.) Для загрузки пользователями.

Пример создания архива каталога docs/usage из удаленного репозитория, к которому вы подключены с помощью ssh:

# in terminal
$ git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage > /tmp/usage_docs.tar

Дополнительная информация в этом сообщении в блоге и документации git.

Примечание по GitHub Repos:

GitHub не разрешает git-archive доступ. ☹️

Ответ 6

Я создал проект с открытым исходным кодом под названием GitHubFolderDownloader. Он позволяет загружать одну папку в репозиторий без клонирования или загрузки всего репозитория.

Ответ 7

Ничего плохого в других ответах нет, но я просто решил поделиться пошаговыми инструкциями для тех, кто впервые проходит через этот процесс.

Как загрузить одну папку из репозитория github (Mac OS X):

~ Чтобы открыть терминал, просто нажмите прожектор и введите терминал, затем нажмите Enter

  1. На Mac у вас, скорее всего, уже есть SVN (для тестирования просто откройте терминал и введите "svn" или "which svn" ~ без кавычек)
  2. На Github: найдите путь Github к вашей папке git (не репо), щелкнув конкретное имя папки в репо
  3. Скопируйте путь из адресной строки браузера
  4. Откройте Терминал и введите: svn export
  5. Следующая вставка в адрес (например): https://github.com/mingsai/Sample-Code/tree/master/HeadsUpUI
  6. Заменить слова: дерево/мастер
  7. со словом: ствол
  8. Введите папку назначения для файлов (в этом примере я сохраняю папку назначения внутри папки "Загрузки" для текущего пользователя)
  9. Здесь пробел - это просто пробел, а не слово (пробел) ~/Downloads/HeadsUpUI
  10. Последняя команда терминала показывает полную команду для загрузки папки (сравните адрес с шагом 5). Svn export https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI ~/Downloads/HeadsUpUI

Кстати, если вы работаете в Windows или на другой платформе, вы можете найти бинарную загрузку Subversion (SVN) на http://subversion.apache.org

~ Если вы хотите извлечь папку, а не просто загрузить ее, попробуйте воспользоваться справкой svn (TL;DR: заменить экспорт на извлечение)

Обновить

По поводу комментария о возобновлении прерванной загрузки/оформления заказа. Я бы попробовал запустить svn cleanup последующим svn update. Пожалуйста, ищите SO для дополнительных опций.

Ответ 8

Кто бы ни работал над определенной папкой, он должен клонировать эту конкретную папку, чтобы сделать это, пожалуйста, следуйте приведенным ниже шагам, используя разреженную проверку.

  1. Создать каталог.

  2. Инициализировать Git-репозиторий. (git init)

  3. Включить разреженные проверки. (git config core.sparsecheckout true)

  4. Сообщите Git, какие каталоги вы хотите (echo 2015/brand/May (обратитесь к папке, над которой вы хотите работать) >> .git/info/sparse-checkout)

  5. Добавьте удаленное устройство (git remote add -f origin https://jafartke.com/mkt-imdev/DVM.git)

  6. Получить файлы (git pull origin master)

Ответ 9

Ты не можешь; в отличие от Subversion, где каждый подкаталог может быть извлечен отдельно, Git работает на основе всего хранилища.

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

Возможно, что внешний интерфейс Git (например, веб-интерфейс GitHub или gitweb) мог бы предоставить вам интерфейс для извлечения заданной папки, но, насколько мне известно, никто из них этого не делает (хотя они позволяют вам скачивать отдельные файлы), так что если папка не содержит слишком много файлов, это вариант)

Редактировать - GitHub на самом деле предлагает доступ через SVN, что позволит вам сделать именно это (согласно комментарию). См. Https://github.com/blog/1438-improved-svn-here-to-stay-old-svn-going-away для получения последних инструкций о том, как это сделать.

Ответ 10

1.Нажмите на эту ссылку http://kinolien.github.io/gitzip/
2. Вставьте ссылку на папку Github, которую вы хотите загрузить.
3. Нажмите на поиск, он покажет все файлы для скачивания.
Примечание: для поиска -Using нет необходимости вводить ключ токена;).. сделайте это просто!

Ответ 11

Если вы действительно просто хотите просто загрузить " папку, а не " клон "" (для разработки), самый простой способ просто получить копию самая последняя версия репозитория (и, следовательно, папка/файл внутри него), без необходимости клонирования всего репо или даже установки git, в первую очередь, заключается в загрузке zip-архива (для любых репо, fork, branch, commit и т.д.), перейдя в желаемый репозиторий /fork/branch/commit на GitHub (например, http(s)://github.com/<user>/<repo>/commit/<Sha1> для копии файлов, как это было после определенного коммита) и выбрав кнопку Downloads рядом с верхним правом.

Этот формат архива не содержит ничего из git -repo magic, только сами отслеживаемые файлы (и, возможно, несколько файлов .gitignore, если они были отслежены, но вы можете игнорировать их: p) - это означает, что если изменения кода и вы хотите остаться на вершине, вам придется вручную перезагрузить его, а это также означает, что вы не сможете использовать его в качестве хранилища git...

Не уверен, что то, что вы ищете в этом случае (опять же, "загрузить" /view vs "clone" /develop ), но это может быть полезно, тем не менее...

Ответ 12

Другой конкретный пример:

Как я хочу скачать 'iOS Pro Geo' папку с URL

https://github.com/alokc83/APRESS-Books-Source-Code-/ дерево/мастер/ %20Pro %20iOS %20Geo

и я могу сделать это через

svn checkout https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo

Обратите внимание на туловище на пути

Отредактировано: (согласно комментарию Tommie C)

Да, использование export вместо checkout даст чистую копию без дополнительных файлов репозитория git.

svn export https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo

Отредактировано: Если дерево/мастер отсутствует в URL-адресе, то вилка его, и он будет там в Forked url.

Ответ 13

Это одно из немногих мест, где SVN лучше, чем Git.

В итоге мы тяготели к трем вариантам:

  • Используйте wget для захвата данных из GitHub (используя представление необработанного файла).
  • Если проекты верхнего уровня публикуют требуемый подмножество данных в качестве артефактов сборки.
  • Откажитесь и используйте полную проверку. Это сильно повлияло на первую сборку, но если вы не получите много трафика, это не слишком сложно в следующих сборках.

Ответ 14

Есть пакет githubdl именем githubdl который может сделать это *:

export GIT_TOKEN=1234567890123456789012345678901234567890123
pip install githubdl
githubdl -u http://github.com/foobar/test -d foo

Страница проекта находится здесь

* Отказ от ответственности: я написал этот пакет.

Ответ 15

Вы можете выполнить простую загрузку дерева каталогов:

git archive --remote [email protected]:foobar/Test.git HEAD:foo | tar xf -

Но если вы хотите проверить это, и сможете совершать коммиты и отталкивать их назад, вы не можете этого сделать.

Ответ 16

Если вы знакомы с командами Unix, вам не нужны специальные зависимости или веб-приложения для этого. Вы можете скачать репо в виде тарбола и распаковать только то, что вам нужно.

Пример (файлы woff2 из подкаталога в fontawesome):

curl -L https://api.github.com/repos/FortAwesome/Font-Awesome/tarball | tar xz --wildcards "*/web-fonts-with-css/webfonts/*.woff2" --strip-components=3
  • Подробнее о формате ссылки: https://developer.github.com/v3/repos/contents/#get-archive-link (в том числе о том, как получить zip файл или конкретные ветки/ссылки)
  • Сохраните начальную часть пути (*/), чтобы соответствовать любому каталогу. Github создает каталог-обертку с именем ref в имени, поэтому он не может быть известен.
  • Вы, вероятно, хотите, чтобы --strip-components было таким же, как количество слешей (/) в пути (предыдущий аргумент).

Это загрузит весь tarball. Используйте метод SVN, упомянутый в других ответах, если этого следует избегать или если вы хотите быть милым с серверами GitHub.

Ответ 17

Чтобы усилить ответы выше, реальным примером из реального репозитория GitHub для локального каталога будет:

svn ls https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces

svn export https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces  /temp/SvnExport/Washburn

Иногда конкретный пример помогает прояснить предложенные замены.

Ответ 18

Я использую linux так, поместите это в ~/.bashrc, называемый even: D $HOME/.bashrc

git-dowloadfolder(){
a="$1"
svn checkout ${a/tree\/master/trunk}

}

затем обновите оболочку с помощью

source ~/.bashrc 

затем используйте его с git -downloadfolder blablabla: D

Ответ 19

Наша команда написала bash script, чтобы сделать это, потому что мы не хотели устанавливать SVN на нашем сервере с пустыми костями.

https://github.com/ojbc/docker/blob/master/java8-karaf3/files/git-download.sh

Он использует API github и может запускаться из командной строки следующим образом:

git-download.sh https://api.github.com/repos/ojbc/main/contents/shared/ojb-certs

Ответ 20

Я работаю с серверами CentOS 7, на которых у меня нет корневого доступа, ни git, svn и т.д. (и не хочу!), поэтому сделал python script для загрузки любой папки github: https://github.com/andrrrl/github-folder-downloader

Использование простое, просто скопируйте соответствующую часть из проекта github, предположим, что проект https://github.com/MaxCDN/php-maxcdn/, и вы хотите, чтобы где есть только исходные файлы, тогда вам нужно сделать что-то вроде:

$ python gdownload.py "/MaxCDN/php-maxcdn/tree/master/src" /my/target/dir/
(создаст целевую папку, если ее не существует)

Для этого требуется lxml библиотека, которую можно установить с помощью easy_install lxml
Если у вас нет доступа root (например, я), вы можете создать файл .pydistutils.py в своем каталоге $HOME с этими содержимым: [install] user=1 И easy_install lxml будет работать (ref: fooobar.com/questions/9287/...).

Ответ 21

Ни один из ответов не помог в моей ситуации. Если вы разрабатываете для Windows, у вас, вероятно, нет SVN. Во многих ситуациях нельзя рассчитывать на то, что пользователи установят Git, или не хотят загружать целые репозитории по другим причинам. Некоторые из людей, которые ответили на этот вопрос, такие как Виллем ван Кетвич и Ацтак, создали инструменты для выполнения этой задачи. Однако, если инструмент написан не для языка, который вы используете, или вы не хотите устанавливать стороннюю библиотеку, они не будут работать.

Тем не менее, есть гораздо более простой способ. GitHub имеет API, который позволяет загружать один файл или все содержимое каталога с помощью запросов GET. Вы можете получить доступ к каталогу, используя https://api.github.com/repos/:owner/:repo_name/contents/:path который возвращает объект JSON, перечисляющий все файлы в каталоге. В перечисление включена ссылка на необработанное содержимое файла, параметр download_url. Файл может быть загружен с использованием этого URL.

Это двухэтапный процесс, требующий умения делать запросы GET, но он может быть реализован практически на любом языке, на любой платформе. Он может быть использован для получения файлов или каталогов.

Ответ 22

Чтобы экспортировать каталог из GitHub, замените "/tree/master/" в каталоге url на "/trunk/".

Например, чтобы экспортировать каталог со следующего URL-адреса:

https://github.com/liferay/liferay-plugins/tree/master/portlets/sample-hibernate-portlet

выполните следующую команду:

svn export https://github.com/liferay/liferay-plugins/trunk/portlets/sample-hibernate-portlet

Ответ 23

Если вам нужно сделать это программно, и вы не хотите полагаться на SVN, вы можете использовать API GitHub для рекурсивно загружать все содержимое.

Для вдохновения здесь моя рубиновая сущность: https://gist.github.com/cvengros/b2a7e82f66519d423b6f

Ответ 24

Используйте эту функцию, первый аргумент - это URL-адрес папки, второй - место, куда папка будет загружена:

function github-dir() {
    svn export "$(sed 's/tree\/master/trunk/' <<< "$1")" "$2"  
}

Ответ 25

Прямой ответ на это - сначала черепаха SVN по следующей ссылке.

https://tortoisesvn.net/downloads.html

во время установки включите параметр CLI, чтобы его можно было использовать из интерфейса командной строки.

скопируйте ссылку на подкаталог git hub.

пример

https://github.com/tensorflow/models/tree/master/research/deeplab

заменить дерево/мастер стволом

https://github.com/tensorflow/models/trunk/research/deeplab

и делать

svn checkout https://github.com/tensorflow/models/trunk/research/deeplab

файлы будут загружены в папку deeplab в текущем каталоге.

Ответ 26

git clone --filter из Git 2.19

Эта опция фактически пропускает выборку ненужных объектов с сервера:

git clone --depth 1 --no-checkout --filter=blob:none \
  "file://$(pwd)/server_repo" local_repo
cd local_repo
git checkout master -- mydir/

Сервер должен быть настроен с:

git config --local uploadpack.allowfilter 1
git config --local uploadpack.allowanysha1inwant 1

Было сделано расширение для протокола Git remote для поддержки этой функции в v2.19.0, но в то время сервер не поддерживал. Но это уже можно проверить на месте.

Я рассмотрел это более подробно на: Как мне клонировать только подкаталог репозитория Git?

Ответ 27

Я написал инструмент с Node.js только для этого. Проверьте это Скачать Repo Dir

установить с помощью npm я -g dl-repo-dir и команда repo будет доступна глобально.

скачать и переименовать каталог в репозитории

repo download aztack/download-repo-dir lib src/lib/new-name

скачать репозиторий

repo download aztack/download-repo-dir '' src/lib/download-repo-dir

скачать из частного репозитория gitlab с данным тегом

export GITLAB_API_PRIVATE_TOKEN=YOUR_TOKEN_HERE

repo download gitlab:mygitlab.com:topgroup/subgroup/repo#v1.0.0 dir src/lib/new-name

и будет файл repo.json для сохранения всей информации.

В новом проекте вы можете инициализировать проект с существующим repo.json с помощью команды repo init.

Ответ 28

Просто наткнулся на это в 2019 году, когда я пытался добиться аналогичных результатов. По словам Атлассиана, для клонирования в определенную папку в репо:

git clone <repo> <directory>

Я только что попробовал, и это работает без каких-либо проблем.

Ответ 29

Если вы хотите использовать Python и SVN для загрузки определенного каталога GitHub, вот код, который вы бы использовали:

import validators
from svn.remote import RemoteClient

def download_folder(url):
    if 'tree/master' in url:
        url = url.replace('tree/master', 'trunk')

    r = RemoteClient(url)
    r.export('output')


if __name__ == '__main__':
    url = input('Enter folder URL: ')
    if not validators.url(url):
        print('Invalid url')
    else:
        download_folder(url)

Вы можете проверить более подробную информацию об этом коде и других подсказках поиска и загрузки GitHub в этом руководстве: https://python.gotrained.com/search-github-api/

Ответ 30

Если directoy, который вы хотите загрузить, является разделенной библиотекой, лучше создать другое репозиторий git, а затем использовать функцию подмодуля git.

Конечно, вы должны быть владельцем первоначального репо, которое вы хотите