Завантажте одну папку або каталог з репо GitHub


1105

Як я можу завантажити лише певну папку чи каталог з віддаленого репортажу Git, розміщеного на GitHub?

Скажіть, наприклад, GitHub repo живе тут:

git@github.com:foobar/Test.git

Її структура каталогів:

Test/
├── foo/ 
│   ├── a.py
│   └── b.py   
└── bar/
    ├── c.py
    └── d.py

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


4
Я написав сценарій оболонки для цього, використовуючи svn checkout - github.com/Decad/github-downloader
Declan Cook

390
Чи може хтось мені пояснити, чому для цього немає "офіційного" рішення веб-інтерфейсу? Це здається тривіальною функцією для втілення, але надзвичайно корисною.
Олександр - Відновіть Моніку

3
Я розробив хромоване розширення за допомогою gitzip KinoLien. github.com/charany1/GHSDD
charany1

3
дивіться @janos відповідь svn альтернатива найкраща, немає автентики, немає реєстрації, немає обмеження, немає плагінів
stackdave

5
Я зробив для цього полегшене рішення ( download-directory.github.io ), і воно інтегровано в
доопрацьований

Відповіді:


1034

Оновлення вересня 2016 року: існує декілька інструментів, створених спільнотою, які можуть зробити це для вас:


Git не підтримує це, але Github робить через SVN. Якщо ви перевірите свій код із підривною роботою, Github по суті перетворить репо з git в підривну роботу на бекенді, а потім обслуговуватиме запитуваний каталог.

Ось як можна використовувати цю функцію для завантаження певної папки. Я буду використовувати lodashприклад популярної бібліотеки javascript .

  1. Перейдіть до папки, яку ви хочете завантажити . Завантажимо /testз masterвідділення. Приклад URL-адреси github repo

  2. Змініть URL-адресу для субверсії . Замініть 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 також підтримує більше підривних функцій , включаючи підтримку внесення та натискання змін.


162
Awesome, просто замініть tree/masterз , trunkі ви можете отримати папку конкретною.
Серхіо Міхельс

6
Спасибі @ user1146881 і @ SérgioMichels, ви повинні замінити tree/masterз trunk. Цю інформацію слід додати у відповідь.
baptx

8
Я змінив це для використання svn export, оскільки не хотів, щоб робоча копія Subversion працювала. Потім я додав отриману папку в Git. (Я якось втратив великий шматок свого каталогу каталогів, тому я експортував з репо, який я
розщепив

5
@ num3ric- вибачте за пізню відповідь, але ви повинні мати можливість замінити "ствол" на "гілки / yourbranch"
псевдонім,

2
@ElijahLynn Дякую за редагування, я повинен був включити цю інформацію! 2 речі, хоч - я прийняв вашу редакцію, але відкатував частину моїх власних (мав на увазі робити це все одно, це було занадто безладним). Крім того, я змінив ваш branchшлях до branches, що я вважаю правильним; якщо ні, то вперед і змініть його назад.
нік

566

Два варіанти цієї функції:

Варіант 1: Розширення браузера GitZip

Розширення Chrome , 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 , використовуючи GitHub API та бібліотеки JSZip, FileSaver.js.

Крок 1: Введіть URL-адресу github у поле вгорі праворуч.
Крок 2. Натисніть клавішу Enter або натисніть на завантаження для завантаження безпосередньо або натисніть кнопку Пошук, щоб переглянути список підпапок і файлів.
Крок 3. Натисніть кнопку "Завантажити Zip-файл" або "Отримати файл", щоб отримати файли.

У більшості випадків це працює чудово, за винятком того, що папка містить понад 1000 файлів через обмеження API Github Trees API. (стосується Github API # Зміст )

А також він може підтримувати приватні / публічні репозиції та покращувати ліміт тарифів, якщо у вас є обліковий запис GitHub і на цьому веб-сайті використовується посилання "отримати маркер".


5
Це дивовижно, але виглядає так, що його настільки приголомшливий попит підштовхує вас до вашого ratelimit, і тому він більше не працює ;-) Було б чудово ввійти в систему за допомогою GitHub oAuth - що дозволило б підтримати приватне репо, а також збільшити обмеження вашої ставки, оскільки вони
отримали

3
@hobailey Тепер він може отримати маркер доступу, щоб збільшити ліміт швидкості, а також отримати доступ до приватних репост.
Кіно

1
@MYounas Дивіться про глави OAuth, дерева, краплі в Github API Doc. , а також використовувати бібліотеки JSZip, FileSaver.js js для реалізації gitzip.
Кіно

1
Хтось би зацікавився хромовим розширенням, яке це робить?
goldylucks

4
Це дійсно потрібно додати до власного веб-сайту github, це надзвичайно корисно.
булочки

508

Перейдіть на DownGit > Введіть свою URL-адресу> Завантажте!

Тепер ви можете Прямо скачати або створити СКАЧУВАННЯ для будь-якого публічного каталогу або файлу GitHub ( особливо великого файлу ) з DownGit ! Ось проста демонстрація -


DownGit


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


2
Брат, я маю на увазі, як створити такий проект, як DownGit, який ти створив.
Мухаммед Юнус

12
Основним методом є: 1. перейдіть на посилання на каталог (використовується кутовий маршрут ), 2. перейдіть до API GitHub , 3. пошукайте каталог і завантажте всі файли, 4. створіть з ним ZIP-файл (я використав jszip ) & збережіть його як файл ( для цього використовували файлосберегач ). Для чіткого розуміння я б запропонував поглянути на свій проект .
Minhas Kamal

1
дякую Бро за детальні інструкції, я вам дуже вдячний, якщо ви запропонуєте будь-який підручник або посилання.
Мухаммед Юнус

5
Це здорово, але він не працює з автоматизованими інструментами (наприклад, wget)
Дзвінок

1
Це замикається,downloaded 25 of 25 files коли я намагаюся завантажити з цієї URL-адреси: github.com/dssg/hitchhikers-guide/tree/master/curriculum/…
Wassadamo

164

Якщо у вас є 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

Це все ще працює? Спробував це з TortiseSVN, і я отримав помилку дозволу, попросивши мене надати облікові дані.
Джон

2
@john Я впевнений, що це занадто пізно, щоб допомогти, але чи увімкнено двофакторну автентифікацію у вашому акаунті GitHub? Якщо так, я думаю, що я десь прочитав, вам доведеться використовувати заздалегідь створений ключ для пароля (який вам потрібно буде знайти в налаштуваннях GitHub).
нік

1
Щодо форматування URL-адреси, ви можете зберегти .gitрозширення. Ви можете скористатись повним посиланням на проект та розпочати, використовуючи svn lsповний шлях проекту. Приклад: svn ls https://github.com/RobTillaart/Arduino.git. Щоб експортувати лише одну папку, ви просто додасте /trunkпотрібний шлях, наприклад svn export https://github.com/RobTillaart/Arduino.git/trunk/libraries/DHTlib. Простіше зберегти шлях проекту недоторканим.
jgrocha

@jgrocha Я не впевнений, що так працювало ще в 2013 році, але це зараз, тож спасибі, оновив пост
janos

1
Приклад: щоб завантажити вміст https://github.com/miguelgrinberg/python-socketio/tree/master/examples/wsgi, запустіть svn export https://github.com/miguelgrinberg/python-socketio.git/trunk/examples/wsgi. Каталог, який називається, wsgiбуде створений під поточним робочим каталогом. Тільки вихідні файли, більше нічого. Ні .git, жодних файлів, пов'язаних із підривом.
Rockallite

74

Для Generic 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доступ . ☹️


2
git archive --format tarформат - не tar.gz, а tar.
出 羽 和 之

Це має бути найкращою відповіддю
Феліпе Коста

2
Я думаю, що це найкраща відповідь, але зауважте, що команда git archive не працює з протоколом https.
бітфокс

@yukihane відредагував розширення з tar.gz на tar, сподіваємось, ОП працює на цьому
mihai

36

Я створив проект з відкритим кодом, який називається GitHubFolderDownloader . Це дозволяє завантажувати одну папку сховища без клонування або завантаження всього сховища.


Чудово працює, якщо вам потрібно завантажувати папки лише з GitHub. Для завантаження потрібної папки потрібен лише маркер Github . Більше виборців може дати цій відповіді деяку популярність.
Алекс Ессільфі

34

Немає нічого поганого в інших відповідях, але я просто думав, що поділюсь покроковими інструкціями для тих, хто блукав цим процесом вперше.

Як завантажити одну папку з сховища github (Mac OS X):

~ Щоб відкрити Термінал, просто натисніть прожектор та введіть термінал, а потім натисніть клавішу Enter

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

BTW - Якщо ви перебуваєте в Windows або на якійсь іншій платформі, ви можете знайти двійкове завантаження підриву (svn) на веб-сайті http://subversion.apache.org

~ Якщо ви хочете оформити папку, а не просто завантажити її, спробуйте скористатися довідкою svn (tldr: замініть експорт на замовлення )

Оновлення

Щодо коментаря щодо відновлення перерваного завантаження / оформлення замовлення. Я б спробував бігти svn cleanupза ним svn update. Будь ласка, знайдіть ТА, щоб отримати додаткові параметри.


1
Я маю завантажити багато файлів із певної папки, і я отримав цю помилку в середині завантаження: svn: E175002: ЗВІТ '/ bgmartins / script-parlamento /! Svn / vcc / default': 200 OK ( github.com ) Як ви можете відновити завантаження?
Мігель

Працювали для мене. Це дивовижно.
Хіт

24

Хто працює над певною папкою, йому потрібно клонувати саму конкретну папку, щоб зробити це, будь ласка, виконайте наступні кроки, використовуючи рідкісні замовлення.

  1. Створіть каталог.

  2. Ініціалізуйте сховище Git. ( git init)

  3. Увімкнути рідкісні замовлення. ( git config core.sparsecheckout true)

  4. Скажіть Git, які каталоги ви хочете (відлуння 2015 / бренд / травень (див. Папку, над якою ви хочете працювати) >> .git/info/sparse-checkout)

  5. Додати пульт ( git remote add -f origin https://jafartke.com/mkt-imdev/DVM.git)

  6. Вилучення файлів ( git pull origin master)


Шкода, що цей коментар не отримав достатньо відгуків. Схоже, що надане рішення стосується всіх git сховищ, а не лише github.
Кальян

9
Але насправді це не робить те, що було бажано. Він все ще клонує весь сховище, він просто не перевіряє деякі папки.
Кріс

Вирішено тут: stackoverflow.com/questions/4114887/…
JK

Я отримую цю помилку: розріджена каса не залишає жодної записи в робочій директорії.
помаранчева гусениця

20

Ви не можете; На відміну від Subversion, де кожен підкаталог можна перевірити окремо, Git працює на основі цілого репозиторію.

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

Можливо, що фронт-інтерфейс Git (наприклад, веб-інтерфейс GitHub або gitweb) міг би вибрати інтерфейс для вилучення певної папки, але, наскільки мені відомо, жоден з них не робить цього (хоча вони дозволяють завантажувати окремі файли , тому якщо папка не містить занадто багато файлів, це варіант)

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


чи є щось через API github?
g_inherit

14

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

Цей архівний формат не містить жодної магії git-repo, лише самих відстежуваних файлів (і, можливо, декілька файлів .gitignore, якщо вони були відстежені, але ви можете ігнорувати такі: p) - це означає, що якщо код зміниться, і ви хочете залишайтеся на вершині, вам доведеться вручну завантажити його знову, а це також означає, що ви не зможете використовувати його як сховище git ...

Не впевнений, що це те, що ви шукаєте в даному випадку (знову ж таки, "скачати" / переглянути проти "клонувати" / розвинути), але все-таки це може бути корисно ...


9
Якщо ви не бачите посилання для завантаження, переконайтеся, що ви перебуваєте на головній сторінці репо (не дочірньому каталозі.) Схоже, ви можете завантажити лише поштовий індекс усього репо. Також ця довідкова сторінка github може бути корисною.
JD Smith

2
Легкий доступ точки "та натискання". Легко отримати попередній реліз. Легко витягнути потрібну папку із завантаженого zip. Дякую.
Енді Томас

1
Загальна URL-адреса для завантаження з tar.gz:https://github.com/${owner}/${repo}/archive/${hash}.tar.gz
Крістіан

11

Підсумок 2019 року

Існує безліч способів вирішити це, залежно від того, чи потрібно це робити вручну чи програмно.

Нижче наведено чотири варіанти. А для тих, хто віддає перевагу більш детальному поясненню, я зібрав відео YouTube: Завантажте окремі файли та папки з GitHub .

Також я опублікував аналогічну відповідь на StackOverflow для тих, кому потрібно завантажити окремі файли з GitHub (на відміну від папок).


1. Інтерфейс користувача GitHub

  • На головній сторінці сховища є кнопка завантаження. Звичайно, при цьому завантажується все репо, після чого вам потрібно буде розпакувати завантаження, а потім вручну перетягнути потрібну папку, яка вам потрібна.

2. Інструменти сторонніх виробників

  • Існує безліч розширень веб-переглядачів та веб-додатків, які впораються з цим, і DownGit є одним із них. Просто вставте URL-адресу GitHub у папку (наприклад https://github.com/babel/babel-eslint/tree/master/lib) та натисніть кнопку "Завантажити".

3. Підрив

  • GitHub не підтримує git-архів (функція git, яка дозволила б нам завантажувати конкретні папки). Однак GitHub підтримує різні функції Subversion, одну з яких ми можемо використовувати для цієї мети. Subversion - це система контролю версій (альтернатива git). Вам знадобиться встановлення Subversion. Візьміть URL-адресу GitHub для папки, яку ви хочете завантажити. Вам потрібно буде змінити цю URL-адресу. Ви хочете, щоб було посилання на сховище, а потім слово "trunk" і закінчувалося шляхом до вкладеної папки. Іншими словами, використовуючи той самий приклад посилання на папку, про який я згадував вище, ми замінили б "дерево / майстер" на "стовбур". Нарешті, відкрийте термінал, перейдіть до каталогу, до якого потрібно завантажувати вміст, введіть наступну команду (замінивши URL-адресу на створену URL-адресу):svn export https://github.com/babel/babel-eslint/trunk/lib, і натисніть клавішу Enter.

4. GitHub API

  • Це рішення, яке вам знадобиться, якщо ви хочете виконати це завдання програмно. І саме це DownGit використовує під кришкою. Використовуючи REST API GitHub , напишіть сценарій, який робить запит GET до кінцевої точки вмісту. Кінцева точка може бути побудована наступним чином : https://api.github.com/repos/:owner/:repo/contents/:path. Після заміни заповнювачів прикладом кінцевої точки є:https://api.github.com/repos/babel/babel-eslint/contents/lib. Це дає вам дані JSON для всього вмісту, який існує у цій папці. Дані містять усе необхідне, включаючи, чи є вміст папкою чи файлом, URL-адреса для завантаження, якщо це файл, і кінцева точка API, якщо це папка (щоб ви могли отримати дані для цієї папки). Використовуючи ці дані, сценарій може рекурсивно проходити весь вміст у цільовій папці, створювати папки для вкладених папок та завантажувати всі файли для кожної папки. Перевірте код натхнення DownGit .

9

Ще один конкретний приклад:

Як і я хочу завантажити папку 'iOS Pro Geo' з URL-адреси

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

і я можу це зробити через

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

Зверніть увагу на стовбур шляху

Відредаговано: (відповідно до коментаря Tommie C)

Так, використання експорту замість каси дасть чисту копію без зайвих файлів сховища git.

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

Відредаговано: Якщо дерева / господаря немає в URL-адресі, виберіть його Fork, і він буде там у URL-адресі Forked.


2
Просто потрібно змінити замовлення на експорт, якщо ви просто хочете завантажити копію папки, а не оформити замовлення.
Tommie C.

Дякую за вашу відповідь, чи можемо ми зануритись у гілку? скажімо, я хочу завантажити папку aaa відгалуження особливості1
hsafarya

7

Існує піп-пакет Python3, githubdlякий може зробити це *:

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

Сторінка проекту тут

* Відмова: Я написав цей пакет.


6

Це одне з небагатьох місць, де SVN кращий за Git.

Врешті-решт ми тяжіли до трьох варіантів:

  1. Використовуйте wget, щоб захопити дані з GitHub (використовуючи перегляд необроблених файлів).
  2. Запропонуйте проектам висхідної течії публікувати необхідну підмножину даних у вигляді артефактів.
  3. Відмовтеся і користуйтеся повним замовленням. Це великий удар у першій збірці, але якщо ви не отримаєте багато трафіку, це не зайве клопоту в наступних складах.

4
Що ж, це менше Git vs Subversion і більше того, що програма GitHub не дозволяє git-архіву. (Я хотів би знати чому.)
Роб Говард

6

Якщо вам зручні команди UNIX, для цього вам не потрібні спеціальні залежності або веб-додатки. Ви можете завантажити репо як тарбол та untar лише те, що вам потрібно.

Приклад (файли 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-файл або конкретні гілки / refs)
  • Зберігайте початкову частину шляху ( */), щоб відповідати будь-якій директорії. Github створює каталог обгортки з посиланням на фіксацію імені, тому його не можна знати.
  • Ви, мабуть, хочете --strip-componentsбути таким самим, як кількість косої риски ( /) на шляху (попередній аргумент).

Це завантажить весь тарбол. Використовуйте метод SVN, згаданий в інших відповідях, якщо цього потрібно уникати, або якщо ви хочете стати приємними для серверів GitHub.


5

Ви можете просто завантажити дерево дерева каталогів:

git archive --remote git@github.com:foobar/Test.git HEAD:foo | tar xf -

Але якщо ви маєте намір перевірити це та зможете виконувати доручення та відштовхувати їх назад, то не можете цього зробити.


1
Недійсна команда: 'git-upload-archive' foobar / Test.git '' Здається, ви використовуєте ssh для клонування URL-адреси git: //. Переконайтесь, що параметр настройки core.gitProxy та змінна середовища GIT_PROXY_COMMAND НЕ встановлені. фатально: на віддаленому кінці несподівано повісили дьоготь: це не схоже на смолу архіву смоли: Вихід зі статусом відмови через попередні помилки
g_inherit

@g_inherit Я можу відтворити це питання. Хоча це може бути правильним напрямком, ця відповідь недійсна.
Uli Köhler

незважаючи на стільки голосів, що ухилилися, це єдина порада, яка працювала на мене.
bhaskarc

5

Для посилення відповідей вище, справжнім прикладом із реального сховища 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

Іноді конкретний приклад допомагає уточнити запропоновані заміни.


5

Жодна відповідь не допомогла в моїй ситуації. Якщо ви розробляєте для Windows, швидше за все, у вас немає svn. У багатьох ситуаціях не можна розраховувати, що користувачі також встановлять Git або не хочуть завантажувати цілі сховища з інших причин. Деякі з людей, які відповіли на це запитання, такі як Віллем ван Кетвіч і Ацака, зробили інструменти для виконання цього завдання. Однак якщо інструмент не написаний для мови, яку ви використовуєте, або ви не хочете встановлювати сторонні бібліотеки, вони не працюють.

Однак існує набагато простіший спосіб. GitHub має API, який дозволяє завантажувати один файл або вміст цілого каталогу за допомогою GET-запитів . Ви можете отримати доступ до каталогу, використовуючи https://api.github.com/repos/:owner/:repo_name/contents/:pathякий повертає об'єкт JSON, що перераховує всі файли в каталозі. В перерахунку включено посилання на неоглядний вміст файлу, download_urlпараметр. Потім файл можна завантажити за допомогою цієї URL-адреси.

Це двоступеневий процес, який вимагає можливості робити запити GET, але це може бути реалізовано майже будь-якою мовою, на будь-якій платформі. З його допомогою можна отримати файли або каталоги.


4

Наша команда написала сценарій bash, щоб це зробити, тому що нам не хотілося встановлювати 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

4

Я використовую Linux так, поставте це у ~ / .bashrc, званий even: D $ HOME / .bashrc

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

}

потім оновіть оболонку за допомогою

source ~/.bashrc 

потім використовуйте його з git-download folderblablabla: D


3

Я працюю з серверами CentOS 7, на яких у мене немає кореневого доступу, ні git, svn тощо (і не хочу!), Тому створив сценарій python для завантаження будь-якої папки github: https://github.com/andrrrl/github -папка-завантажувач

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

$ python gdownload.py "/MaxCDN/php-maxcdn/tree/master/src" /my/target/dir/
(створить цільову папку, якщо її немає)

Для цього потрібна бібліотека lxml , її можна встановити. easy_install lxml
Якщо у вас немає кореневого доступу (як я), ви можете створити .pydistutils.pyфайл у своєму $HOMEdir із цим вмістом: [install] user=1 І easy_install lxmlпросто працюватиме (посилання: https://stackoverflow.com/a/ 33464597/591257 ).


3

Всього 5 кроків

1) Завантажити SVN з тут .
2) Відкрийте CMD і перейдіть до каталогу сміттєвих файлів SVN, як показано нижче:

cd %ProgramFiles%\SlikSvn\bin

3) Припустимо, я хочу завантажити URL цього каталогу
https://github.com/ZeBobo5/Vlc.DotNet/tree/develop/src/Samples

4) Тепер Замінити
tree/develop
or
tree/master
З
trunk

5) Тепер запустіть цю останню команду в папку завантаження в тому ж каталозі.
svn export https://github.com/ZeBobo5/Vlc.DotNet/trunk/src/Samples


Схоже, це не працює для приватних
репостів

Так, це не спрацює для приватних пропозицій, GIT рекомендується для завантаження приватних відповідей.
Мухаммед Алі

2

Щоб експортувати каталог з 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

2

Відверта відповідь на це - спочатку черепаха 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 https://github.com/tensorflow/models/trunk/research/deeplab

файли будуть завантажені в папку deepplab у поточному каталозі.


2

ви можете використовувати git svn наступним чином.

git svn clone https://github.com/lodash/lodash/trunk/test

Таким чином, вам не доведеться переживати біль налаштування svn, спеціально для користувачів Windows.


Дякую тобі. Я можу поручити, що це працює для Windows. Не працює на gcloud. У ньому сказано git: "svn" - це не команда
JOSEPH Blessingh

sudo apt install git-svnпотрібен при запуску через WSL.
Джеммі Доджер

1

Якщо вам потрібно це робити програмно, і ви не хочете покладатися на SVN, ви можете скористатися API GitHub для рекурсивного завантаження всього вмісту.

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


1

Використовуйте цю функцію, перший аргумент - це URL-адреса папки, другий - це місце, в яке буде завантажена папка:

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

1

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 для підтримки цієї функції в v2.19.0, але на даний момент немає підтримки сервера. Але це вже можна перевірити на місцях.

Це я детальніше висвітлив у: Як я клоную лише підкаталог сховища Git?


1
Цікаво і прихильно. Я думаю, я повинен був згадати цю функцію 2.19 в інших місцях.
VonC

@VonC Я думаю, що я один раз перебив тебе це: stackoverflow.com/questions/2466735/…, і я подивився на це лише після виходу XD! Я, звичайно, сьогодні гуглив трохи після виходу 2.22, всі відповіді вже оновлені, звичайно ;-) Це ніколи не перестає мене розважати, як завжди залишається ще один напівдублікат, і я закінчую його через рік дещо інший запит. Я не маю наміру бити вас на git, хоч і занадто важко, але слідкуйте за підрахунками некромана! ха-ха
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

Що ж, продовжуйте гарну роботу: усі громади отримають користь від цієї маленької побічної конкуренції (і я тоді схвалив вашу іншу відповідь)
VonC

@VonC жартую, звичайно, я підтверджую також ваші речі. Мені просто потрібно знайти спосіб повернути ці очки в гроші зараз XD
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

1

З будь-якої причини svnрішення для мене не працює, і оскільки мені svnнічого іншого не потрібно, не було сенсу витрачати час на те, щоб його зробити, тому я шукав просте рішення за допомогою інструментів, які у мене вже були. Цей скрипт використовує лише curlта awkдля завантаження всіх файлів у каталозі GitHub, описаних як"/:user:repo/contents/:path" .

Повернене тіло виклику до команди GitHub REST API "GET /repos/:user:repo/contents/:path"повертає об'єкт, що включає в себе a"download_url" посилання на кожен файл у каталозі.

Цей скрипт командного рядка викликає, що REST API використовує curlта надсилає результат через AWK, який фільтрує всі, крім рядків "download_url", стирає лапки та коми з посилань, а потім завантажує посилання, використовуючи інший виклик для згортання.

curl -s https://api.github.com/repos/:user/:repo/contents/:path | awk \
     '/download_url/ { gsub("\"|,", "", $2); system("curl -O "$2"); }'

1

git sparse-checkout

Git 2.25.0 включає в себе нову експериментальну git sparse-checkoutкоманду, яка робить існуючу функцію простішою у використанні, а також деякі важливі переваги продуктивності для великих сховищ. ( Блог GitHub )

Приклад з поточною версією :

git clone --filter=blob:none --sparse https://github.com/git/git.git
cd git
git sparse-checkout init --cone
git sparse-checkout add t

Дуже помітно

  • --sparseперевіряє лише gitробочі копії файлів каталогів верхнього рівня у сховищі
  • git sparse-checkout add tпоступово додає / перевіряє tпапкуgit

Інші елементи

  • git sparse-checkout init робить деякі препарати, щоб включити часткові каси
  • --filter=blob:noneоптимізує отримання даних, завантажуючи лише необхідні об'єкти git (подивіться на функцію часткового клонування для подальшої інформації)
  • --cone також прискорює продуктивність, застосовуючи більш обмежені шаблони включення файлів

Статус GitHub

GitHub все ще оцінює цю функцію внутрішньо, хоча вона включена у декількох сховищах [...]. Коли функція стабілізується та дозріває, ми будемо постійно інформувати про її прогрес. ( документи )


Отримано. Я представив цю команду в stackoverflow.com/a/59515426/6309 , із встановленим шаблоном клонування.
VonC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.