【问题标题】:What's the best way to extract a tree from a git repository?从 git 存储库中提取树的最佳方法是什么?
【发布时间】:2011-03-22 19:55:40
【问题描述】:

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

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

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

我已经编写了一个小脚本来执行此操作,因此我将添加它作为可能的答案。看来这种东西很可能是 git 内置的,但就是不知道怎么找……

【问题讨论】:

    标签: git


    【解决方案1】:

    您可以为此使用git archive

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

    【讨论】:

    • 天哪,一个即时的答案!谢谢,这很理想 - 比我的脚本快得多。
    • 一个额外的好处是,您可以使用 --remote 针对另一个(甚至是裸露的)存储库远程执行此操作
    【解决方案2】:

    您可以将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:这个更“低级”;存档解决方案更多的是用户命令。我不知道这个表现是好是坏。我将答案分开,因为我真的很想知道哪个更受欢迎。
    • 正如 cxreg 所暗示的,对于裸存储库和 git 1.7.0.4,“git checkout-index”步骤失败,并显示“致命:此操作必须在工作树中运行”。 (我认为,在设置 GIT_INDEX_FILE 并使用 --prefix 的情况下,这似乎有些奇怪。)所以我会接受另一个答案,因为裸存储库案例对我来说很重要,但这对了解非常有用 -谢谢你们。
    • @DavidSchmitt:我不明白你的编辑。也许我不理解用例,签出裸存储库的子目录似乎是一件有点奇怪的事情。为什么我们需要$(pwd) 以及为什么我们需要将-f 传递给checkout-index?我认为您已经完全改变了我回答的意图,但我不确定。
    • @Charles:抱歉,编码晚了。目的是 GIT_WORK_TREE 和 GIT_INDEX_FILE 必须是绝对路径,否则你会得到错误标记评论。我现在将其更改为虚拟值。希望这不那么晦涩难懂。实际上,这现在应该能够独立于 cwd 运行,并将 $GIT_DIR 中 master 的 src/ 目录检出到 $GIT_WORK_TREE 中。
    【解决方案3】:

    我现在正在用这个脚本做这个:

    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/
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2013-05-23
      • 2011-05-21
      相关资源
      最近更新 更多