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

5

使用git show轻松从任意版本中提取blob(文件),例如:

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

然而,我想知道在git中是否有类似的方式来递归地提取树形目录及其下的所有内容?

我已经编写了一个小脚本来完成这个任务,所以我会将其作为可能的答案添加进去。看起来这可能是git内置的功能之一,但我不知道如何找到它...

3个回答

13

您可以使用 git archive 来实现此操作。

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

好的,瞬间回答!谢谢,那太理想了 - 比我的脚本快得多。 - Mark Longair
1
这样做的另一个额外好处是,您可以远程完成它,与另一个(即使是空白)存储库进行 --remote 操作。 - cxreg

8
您可以使用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


聪明 :) 除了不依赖tar之外,有没有特别喜欢那个回答而不是你的“git archive”回答的原因? - Mark Longair
@Mark Longair:这个更加“底层”;档案解决方案更多是用户命令。我不知道这个是表现更好还是更差。我将答案分开,因为我真的很想知道哪一个更受欢迎。 - CB Bailey
@DavidSchmitt:我不理解你的编辑。也许我不理解使用情况,检出到裸仓库的子目录似乎是一个有点奇怪的事情。为什么我们需要 $(pwd),为什么我们需要传递 -fcheckout-index?我认为你完全改变了我的答案意图,但我不太确定。 - CB Bailey
我非常非常不喜欢推荐导出 GIT_* 环境变量。太容易忘记取消设置,最终做一些疯狂的事情。我觉得你试图为不同的情况提供解决方案。也许你的脚本应该是自己的答案? - CB Bailey
@DavidSchmitt:我刚刚进行了测试,我非常确定对于GIT_WORK_TREE使用完整路径并不重要。重要的是当前目录是否在GIT_WORK_TREE指定的路径中。 - CB Bailey
显示剩余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/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接