使用git show
轻松从任意版本中提取blob(文件),例如:
git show master:src/hello-world.c > /tmp/hello.c
然而,我想知道在git中是否有类似的方式来递归地提取树形目录及其下的所有内容?
我已经编写了一个小脚本来完成这个任务,所以我会将其作为可能的答案添加进去。看起来这可能是git内置的功能之一,但我不知道如何找到它...
使用git show
轻松从任意版本中提取blob(文件),例如:
git show master:src/hello-world.c > /tmp/hello.c
然而,我想知道在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
。
$(pwd)
,为什么我们需要传递 -f
给 checkout-index
?我认为你完全改变了我的答案意图,但我不太确定。 - CB BaileyGIT_*
环境变量。太容易忘记取消设置,最终做一些疯狂的事情。我觉得你试图为不同的情况提供解决方案。也许你的脚本应该是自己的答案? - CB BaileyGIT_WORK_TREE
使用完整路径并不重要。重要的是当前目录是否在GIT_WORK_TREE
指定的路径中。 - CB Bailey我目前正在使用这个脚本来完成这个任务:
...它解析了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/