做一个“git export”(如“svn export”)?

我一直在想,是否有一个很好的“git export”解决方案可以创建没有.git存储库目录的树的副本。 至少有三种方法我知道:

  • git clone然后删除.git存储库目录。
  • git checkout-index暗示了这个功能,但是以“只需将所需的树读入索引...”开始,我不完全知道该怎么做。
  • git-export是第三方脚本,它基本上将git clone到临时位置,然后是rsync --exclude='.git'到最终目的地。
  • 这些解决方案都不能令我满意。 与svn export最接近的一个可能是选项1,因为这两者都要求目标目录首先为空。 但是选项2似乎更好,假设我可以弄清楚在索引中读取树意味着什么。


    可能最简单的方法是使用git archive 。 如果你真的需要扩展树,你可以做这样的事情。

    git archive master | tar -x -C /somewhere/else
    

    大多数情况下,我需要从git中“导出”某些东西,无论如何我都需要一个压缩存档,所以我可以这样做。

    git archive master | bzip2 >source-tree.tar.bz2
    

    ZIP档案:

    git archive --format zip --output /full/path/to/zipfile.zip master 
    

    git help archive了解更多细节,它非常灵活。


    注意:如果您有兴趣导出索引,则命​​令是

    git checkout-index -a -f --prefix=/destination/path/
    

    (有关更多详细信息,请参阅Greg的答案)


    我发现了选项2的含义。 从存储库中,您可以执行以下操作:

    git checkout-index -a -f --prefix=/destination/path/
    

    路径末尾的斜杠很重要,否则会导致文件位于/目的地前缀为“路径”。

    由于在正常情况下,索引包含存储库的内容,因此“将所需树读入索引”没有什么特别之处。 它已经在那里。

    -a标志是检查索引中的所有文件所必需的(我不确定在这种情况下忽略这个标志是什么意思,因为它没有做我想做的)。 -f标志强制覆盖输出中的任何现有文件,该命令通常不会这样做。

    这似乎是我寻找的那种“git export”。


    git archive也可以与远程仓库一起使用。

    git archive --format=tar 
    --remote=ssh://remote_server/remote_repository master | tar -xf -
    

    为了在repo中导出特定路径,可以添加尽可能多的路径作为git的最后一个参数,例如:

    git archive --format=tar 
    --remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv
    
    链接地址: http://www.djcxy.com/p/677.html

    上一篇: Do a "git export" (like "svn export")?

    下一篇: Reset local repository branch to be just like remote repository HEAD