Какой лучший способ извлечь дерево из репозитория git? - PullRequest
5 голосов
/ 29 июля 2010

Извлечение большого двоичного объекта (файла) из произвольной ревизии легко с git show, например ::

 git show master:src/hello-world.c > /tmp/hello.c

Однако я хотел бы знать, существует ли подобный способ в git для извлечения дерева (каталога) и всего, что под ним, рекурсивно?

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

Ответы [ 3 ]

13 голосов
/ 29 июля 2010

Вы можете использовать git archive для этого.

git archive master:src/ | tar -C destination -x
6 голосов
/ 29 июля 2010

Вы можете использовать read-tree и checkout-index с временным индексным файлом:

GIT_INDEX_FILE=.tmp.index { git read-tree master:src &&
                            git checkout-index -a --prefix=dest/; 
                            rm -f .tmp.index; }

(Разрывы строк добавлены для ясности, но на самом деле это одна строка).

Для пустого хранилища вы должны сделать вид, что рабочее дерево существует и что вы в нем:

GIT_INDEX_FILE=.tmp.index GIT_DIR=/path/to/repo.git GIT_WORK_TREE=. {
    git read-tree master:src &&
    git checkout-index -a --prefix=/path/to/dest/; 
    rm -f .tmp.index; }

Если запустить изнутри пустого хранилища, вы можете пропустить настройку GIT_DIR.

0 голосов
/ 29 июля 2010

Сейчас я делаю это с помощью этого скрипта:

http://gist.github.com/498447

... который анализирует вывод git ls-tree -r -z <tree-ish>. Вы можете передать ему все, что git ls-tree может понять как дерево, например:

extract-tree-from-git.py master:src/tests/ /tmp/extracted-tests/
extract-tree-from-git.py HEAD^ /tmp/parent-of-head/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...