从git存储库中提取树的最佳方法是什么?

时间:2010-07-29 16:05:13

标签: git

使用git show可以轻松地从任意修订版中提取blob(文件),例如:

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

但是,我想知道在git中是否有类似的方法来提取树(目录)以及递归下的所有内容?

我已经编写了一个小脚本来执行此操作,因此我将其添加为可能的答案。看来这可能是git内置的那种东西,但我只是不知道如何找到它......

3 个答案:

答案 0 :(得分:13)

您可以使用git archive

git archive master:src/ | tar -C destination -x

答案 1 :(得分:6)

您可以将read-treecheckout-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

答案 2 :(得分:0)

我现在用这个脚本做这个:

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/