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

Mar*_*air 5 git

从任意修订版中提取blob(文件)很容易git show,例如:

 git show master:src/hello-world.c > /tmp/hello.c
Run Code Online (Sandbox Code Playgroud)

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

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

CB *_*ley 13

你可以用git archive它.

git archive master:src/ | tar -C destination -x
Run Code Online (Sandbox Code Playgroud)


CB *_*ley 6

您可以使用read-treecheckout-index使用临时索引文件:

GIT_INDEX_FILE=.tmp.index { git read-tree master:src &&
                            git checkout-index -a --prefix=dest/; 
                            rm -f .tmp.index; }
Run Code Online (Sandbox Code Playgroud)

(为了清晰起见,添加了换行符,但它实际上是一个单行.)

对于裸存储库,您必须假装存在一个工作树并且您在其中:

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; }
Run Code Online (Sandbox Code Playgroud)

如果从裸存储库中运行,则可以省略设置GIT_DIR.