使用git show
可以轻松地从任意修订版中提取blob(文件),例如:
git show master:src/hello-world.c > /tmp/hello.c
但是,我想知道在git中是否有类似的方法来提取树(目录)以及递归下的所有内容?
我已经编写了一个小脚本来执行此操作,因此我将其添加为可能的答案。看来这可能是git内置的那种东西,但我只是不知道如何找到它......
答案 0 :(得分:13)
您可以使用git archive
。
git archive master:src/ | tar -C destination -x
答案 1 :(得分:6)
您可以将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
。
答案 2 :(得分:0)
我现在用这个脚本做这个:
...解析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/