LINUX.ORG.RU

Скачать с гитхаба *одну* директорию, без истории, в данный момент её истории

 , , ,


0

1

Привет всем!

Нужно скачать с гитхаба копию (=снэпшот=без истории) некоторой директории (именно некоторой - не хочу скачивать другие, там могут быть большие объёмы картинок-звуков и пр.) в произвольный момент времени, например, директорию include после этого коммита. Изначально никаких данных репы локально нет.

(про svn export знаю, пользуюсь, но он скачивает лишь то что было помечено тагами - брэнчи, а у меня есть лишь некий id коммита, или дерева.).

Какими командами git это можно сделать?

Вообще да, искал. Вот например простыня советов. Но что-то не то совсем советуют, или я не понимаю.


Скачать с гитхаба *одну* директорию, без истории, в данный момент её истории

скачать зипник распаковать удалить все каталоги кроме понравившегося.

mos ★★☆☆☆ ()

Нельзя, насколько я знаю. Можно скачать одну ветку с одним коммитом:

git clone git_rebo -b branch_or_tag --depth=1

Можно скачать архив проекта с определённого коммита:

https://github.com/[NICK]/[PROJECT]/archive/[GIT_COMMIT].tar.gz (или zip).

Но чтобы одну только директорию, такого вроде как нет.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Если в pack-файле будут объекты внутри и вне нужного поддерева, то скорее всего скачается. Но он же может быть не один, так что итоговый объём может оказаться меньше скачивания репозитория полностью.

xaizek ★★★★★ ()
Ответ на: комментарий от grem
$ git init
Initialized empty Git repository in /mnt/win1/git-play/.git/
$ git remote add origin -f https://github.com/openglredbook/examples
Updating origin
remote: Enumerating objects: 636, done.
^Cceiving objects:  15% (99/636), 44.54 MiB | 4.11 MiB/s  

Скачивает — минус номер раз. И как задать ревизию — я непонял — минус номер два. (а когда ветвь=мастер, svn export вполне решение).

the1 ()
Ответ на: комментарий от the1

Это чё, ещё и svn ставить?

Какую ещё ревизию? Как в гит переключить ревизию - отдельный вопрос: git checkout commit_hash

Конечно скачивает, а ты что в начале хотел?

grem ★★★★★ ()
Последнее исправление: grem (всего исправлений: 2)

За то время пока ты ждал ответа на этот вопрос или читал SO или читал бы man если бы git это умел, эту жалкую сотню метров репозитория можно было скачать на любом соединении быстрее модема. И что ты сэкономил в итоге?

А так - на, не благодари. Список файлов ты мог бы узнать через API.

#!/bin/sh -eu

COMMIT=f3f94c7ed38034a6cf751dd713aa55f8580dc9bf

files="
GL/glcorearb.h
GL/glext.h
GL3/gl3.h
GL3/gl3w.h
Shares/Cube.h
Shares/Teapot.h
CheckError.h
LoadShaders.h
mat.h
vapp.h
vbm.h
vec.h
vermilion.h
vgl.h
vmath.h
vutils.h
"

for f in $files; do
    echo "Fetching $f"
    mkdir -p $(dirname $f)
    curl --silent https://raw.githubusercontent.com/openglredbook/examples/$commit/$f > $f
done
slovazap ★★★★★ ()
Последнее исправление: slovazap (всего исправлений: 1)
Ответ на: комментарий от slovazap

И что ты сэкономил в итоге?

Я надеялся сэкономить. Невинность своих нежных эстетических чувств от суровых реалий жизни. И потерю веры в человечество.

Список файлов ты мог бы узнать через API.

Вот этот момент, можно поподробнее? Что-то всякие git show, log, diff-tree хотят локальную репу.

the1 ()
Ответ на: комментарий от the1

Вот этот момент, можно поподробнее? Что-то всякие git show, log, diff-tree хотят локальную репу.

При чём тут git? API github.

% curl https://api.github.com/repos/openglredbook/examples/contents/include\?ref=f3f94c7ed38034a6cf751dd713aa55f8580dc9b
[
  {
    "name": "CheckError.h",
    "path": "include/CheckError.h",
    "sha": "be040fe75ec800bca4383529730a4fcbe4ac740e",
    "size": 1281,
    "url": "https://api.github.com/repos/openglredbook/examples/contents/include/CheckError.h?ref=f3f94c7ed38034a6cf751dd713aa55f8580dc9b",
    "html_url": "https://github.com/openglredbook/examples/blob/f3f94c7ed38034a6cf751dd713aa55f8580dc9b/include/CheckError.h",
    "git_url": "https://api.github.com/repos/openglredbook/examples/git/blobs/be040fe75ec800bca4383529730a4fcbe4ac740e",
    "download_url": "https://raw.githubusercontent.com/openglredbook/examples/f3f94c7ed38034a6cf751dd713aa55f8580dc9b/include/CheckError.h",
    "type": "file",
    "_links": {
      "self": "https://api.github.com/repos/openglredbook/examples/contents/include/CheckError.h?ref=f3f94c7ed38034a6cf751dd713aa55f8580dc9b",
      "git": "https://api.github.com/repos/openglredbook/examples/git/blobs/be040fe75ec800bca4383529730a4fcbe4ac740e",
      "html": "https://github.com/openglredbook/examples/blob/f3f94c7ed38034a6cf751dd713aa55f8580dc9b/include/CheckError.h"
    }
  },
  {
    "name": "GL",
    "path": "include/GL",
    "sha": "bd3a7677d7ba9535ab2d7bfa0b69659d46722274",
    "size": 0,
    "url": "https://api.github.com/repos/openglredbook/examples/contents/include/GL?ref=f3f94c7ed38034a6cf751dd713aa55f8580dc9b",
    "html_url": "https://github.com/openglredbook/examples/tree/f3f94c7ed38034a6cf751dd713aa55f8580dc9b/include/GL",
    "git_url": "https://api.github.com/repos/openglredbook/examples/git/trees/bd3a7677d7ba9535ab2d7bfa0b69659d46722274",
    "download_url": null,
    "type": "dir",
    "_links": {
      "self": "https://api.github.com/repos/openglredbook/examples/contents/include/GL?ref=f3f94c7ed38034a6cf751dd713aa55f8580dc9b",
      "git": "https://api.github.com/repos/openglredbook/examples/git/trees/bd3a7677d7ba9535ab2d7bfa0b69659d46722274",
      "html": "https://github.com/openglredbook/examples/tree/f3f94c7ed38034a6cf751dd713aa55f8580dc9b/include/GL"
    }
  },
  {
    "name": "GL3",
    "path": "include/GL3",
    "sha": "83ac14980b9489ad73d4885dd00030086dc160dc",
    "size": 0,
    "url": "https://api.github.com/repos/openglredbook/examples/contents/include/GL3?ref=f3f94c7ed38034a6cf751dd713aa55f8580dc9b",
    "html_url": "https://github.com/openglredbook/examples/tree/f3f94c7ed38034a6cf751dd713aa55f8580dc9b/include/GL3",
    "git_url": "https://api.github.com/repos/openglredbook/examples/git/trees/83ac14980b9489ad73d4885dd00030086dc160dc",
    "download_url": null,
    "type": "dir",
    "_links": {
      "self": "https://api.github.com/repos/openglredbook/examples/contents/include/GL3?ref=f3f94c7ed38034a6cf751dd713aa55f8580dc9b",
      "git": "https://api.github.com/repos/openglredbook/examples/git/trees/83ac14980b9489ad73d4885dd00030086dc160dc",
      "html": "https://github.com/openglredbook/examples/tree/f3f94c7ed38034a6cf751dd713aa55f8580dc9b/include/GL3"
    }
  },
  ...
]

Надеюсь с тем чтобы распарсить json и применить подход рекурсивно к директориям проблем не возникнет.

slovazap ★★★★★ ()
Последнее исправление: slovazap (всего исправлений: 1)

В 2.19 запилили git clone --filter, позволяющий скачивать не весь репозиторий, а только ту часть, которая реально используется, но по-моему github это еще не поддерживает

annulen ★★★★★ ()
Ответ на: комментарий от slovazap

Надеюсь с тем чтобы распарсить json и применить подход рекурсивно к директориям проблем не возникнет.

Думаю никаких проблем не возникнет. Только вот сделаю я это... Ну например когда спаяю пару коротковолновых радиостанций, одна из которых будет подключена в инет, а вторая... ну скажем так, мобильная будет 8) И я буду экономить каждый бит. Тогда и напишу такой парсер.

А пока не спаял — буду либо по отдельности файлики качать (вручную, или с твоим скриптом), либо репы целиком, с историей, как все.

Спасибо.

the1 ()
Ответ на: комментарий от the1

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

Я просто напомню:

$ man git
GIT(1)

NAME
       git - the stupid content tracker

Ты слишком много хочешь от stupid content tracker. Я вот хочу докачку и возможность добавления пустых директорий.

EXL ★★★★★ ()

Эх...

А вот в svn версии где-то до 1.6 такое поведение работало из коробки. Там в _каждом_ каталоге рабочей копии создавался подкаталог .svn, который можно было отдельно заcheckoutить, потом с ним полноценно работать и даже коммитить.

Но потом они собезьянничали то ли с git, то ли с hg, и теперь там, как и в других современных VCS, один .svn на всё.

hobbit ★★★★★ ()