我一直在想是否有一个很好的 “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 目录,它也会包含其他隐藏的 git 特定文件,如. gitignore,.gitattributes 等。如果您不想在存档中使用它们,请确保使用. gitattributes 文件中的 export-ignore 属性,并在进行归档之前提交此属性。 阅读更多...
注意:如果您对导出索引感兴趣,则命令为
git checkout-index -a -f --prefix=/destination/path/
(有关详细信息,请参阅Greg 的回答 )
我发现了 2 选项意味着什么。从存储库中,您可以执行以下操作:
git checkout-index -a -f --prefix=/destination/path/
路径末尾的斜杠很重要,否则会导致文件位于 / 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