【发布时间】:2011-03-22 19:55:40
【问题描述】:
使用git show 可以轻松从任意修订版中提取 blob(文件),例如:
git show master:src/hello-world.c > /tmp/hello.c
但是,我想知道 git 中是否有类似的方法来递归提取树(目录)及其下的所有内容?
我已经编写了一个小脚本来执行此操作,因此我将添加它作为可能的答案。看来这种东西很可能是 git 内置的,但就是不知道怎么找……
【问题讨论】:
标签: git
使用git show 可以轻松从任意修订版中提取 blob(文件),例如:
git show master:src/hello-world.c > /tmp/hello.c
但是,我想知道 git 中是否有类似的方法来递归提取树(目录)及其下的所有内容?
我已经编写了一个小脚本来执行此操作,因此我将添加它作为可能的答案。看来这种东西很可能是 git 内置的,但就是不知道怎么找……
【问题讨论】:
标签: git
您可以为此使用git archive。
git archive master:src/ | tar -C destination -x
【讨论】:
您可以将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。
【讨论】:
git archive 答案吗?
$(pwd) 以及为什么我们需要将-f 传递给checkout-index?我认为您已经完全改变了我回答的意图,但我不确定。
我现在正在用这个脚本做这个:
... 解析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/
【讨论】: